Mong বা শর্তের সাথে মঙ্গুজের সন্ধানের পদ্ধতিটি সঠিকভাবে কাজ করে না


116

সম্প্রতি আমি নোডেজে মোঙ্গুজের সাথে মঙ্গোডিবি ব্যবহার শুরু করি।

আমি যখন $orশর্ত এবং _idক্ষেত্রের সাথে Model.find পদ্ধতি ব্যবহার করি, তখন মঙ্গুজ সঠিকভাবে কাজ করে না।

এটা কাজ করে না:

User.find({
  $or: [
    { '_id': param },
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

যাইহোক, আমি যদি '_id' অংশটি সরিয়ে ফেলি তবে এটি কাজ করে!

User.find({
  $or: [
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});

এবং মঙ্গোডিবি শেলের মধ্যে উভয়ই সঠিকভাবে কাজ করে।

উত্তর:


211

আমি এটি গুগলিংয়ের মাধ্যমে সমাধান করেছি:

var ObjectId = require('mongoose').Types.ObjectId;
var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
// You should make string 'param' as ObjectId type. To avoid exception, 
// the 'param' must consist of more than 12 characters.

User.find( { $or:[ {'_id':objId}, {'name':param}, {'nickname':param} ]}, 
  function(err,docs){
    if(!err) res.send(docs);
});

2
এই সমাধানটি শব্দগুলির সাথে কেন কাজ করে আপনি বর্ণনা করতে পারেন? ধন্যবাদ
আলেকজান্ডার মিলস

এটি দেখতে বরং একটি নির্দিষ্ট সমস্যার সমাধান বলে মনে হচ্ছে। আপনি অনুসন্ধান চালিয়ে যেতে হতে পারে।
কেসারিয়ান

আপনি আপনার রেফারেন্স সরবরাহ করতে পারেন? এই ক্ষেত্রে কেন পরমকে 12 টিরও বেশি অক্ষর থাকতে হবে? এটি আপনার সমস্যা বা অবজেক্টআইডি () এর প্রয়োজনীয়তার সাথে নির্দিষ্ট? আমার পরমের যদি 12 টি অক্ষর না থাকে তবে কী হবে? ধন্যবাদ!
yusong

6
আপনি নিম্নলিখিত হিসাবে অবজেক্টআইডি পরীক্ষা করতে পারেন:const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)
অরহান

@ ইউসুং এর কারণে এটি মংসের কারণে এটি একটি বৈধ অবজেক্টআইডি না হলে একটি ত্রুটি ফেলবে। এটি করার একটি পরিষ্কার উপায় আমার উপরে উল্লিখিত।
হায়দার আলী ইসমাইল

53

আমি সবাইকে মঙ্গসের ক্যোয়ারি বিল্ডার ভাষা এবং কলব্যাকের পরিবর্তে প্রতিশ্রুতি ব্যবহার করার জন্য অনুরোধ করছি:

User.find().or([{ name: param }, { nickname: param }])
    .then(users => { /*logic here*/ })
    .catch(error => { /*error logic here*/ })

মঙ্গুজ ক্যোয়ারী সম্পর্কে আরও পড়ুন ।


এটা ভালবাসা! সতর্ক থাকুন জন্য ধন্যবাদ!
জেকডুড

0

মঙ্গোডিবি ডকুমেন্টেশন অনুসারে: "... এটি, মঙ্গোডিবি-র একটি $ বা ভাবের মূল্যায়ন করতে সূচী ব্যবহার করার জন্য, $ বা এক্সপ্রেশনের সমস্ত ধারা অবশ্যই সূচি দ্বারা সমর্থিত হতে হবে।"

সুতরাং আপনার অন্যান্য ক্ষেত্রগুলির জন্য সূচকগুলি যুক্ত করুন এবং এটি কার্যকর হবে। আমারও একই সমস্যা ছিল এবং এটি এটিকে সমাধান করে।

আপনি এখানে আরও পড়তে পারেন: https://docs.mongodb.com/manual/references/operator/query/or/


1
এটি একটি ভুল বক্তব্য - সংগ্রহের স্ক্যান এড়ানোর জন্য আপনার কেবল সূচিগুলি ব্যবহার করতে হবে - অর্থাত্ পারফরম্যান্সের জন্য। তবে যদি পারফরম্যান্সটি কোনও সমস্যা না হয় (যেমন সংগ্রহটি বেশ ছোট), তবে তাতে কিছু আসে যায় না
অ্যান্ডি লরেঞ্জ

0
async() => {
let body = await model.find().or([
  { name: 'something'},
  { nickname: 'somethang'}
]).exec();
console.log(body);
}
/* Gives an array of the searched query!
returns [] if not found */

1
আপনার উত্তর কীভাবে গোবিন্দ রাইয়ের চেয়ে আলাদা? কি তাদের তুলনায় আপনার উচ্চতর করে তোলে?
বিডিএল

অ্যাসিঙ্ক / অপেক্ষা, কিছুই এটি শ্রেষ্ঠতর করে তোলে?
ফায়ারজ

2
কোড-কেবলমাত্র উত্তরগুলি সাধারণত এই সাইটে ভ্রান্ত হয়। আপনার কোডটির কিছু মন্তব্য বা ব্যাখ্যা অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করতে পারেন? ব্যাখ্যাগুলির মতো প্রশ্নের উত্তর দেওয়া উচিত: এটি কী করে? কিভাবে এটা কাজ করে? কোথায় যায়? এটি কীভাবে ওপির সমস্যা সমাধান করবে? দেখুন: কিভাবে নতুনকরণ করবেন । ধন্যবাদ!
এডুয়ার্ডো বাইটেলো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.