$ या शर्त के साथ Mongoose की खोज विधि ठीक से काम नहीं करती है


116

हाल ही में मैं Nodejs पर Mongoose के साथ MongoDB का उपयोग करना शुरू करता हूं।

जब मैं $orहालत और _idक्षेत्र के साथ Model.find विधि का उपयोग करता हूं , तो Mongoose ठीक से काम नहीं करता है।

यह काम नहीं करता:

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);
});

और MongoDB शेल में, दोनों ठीक से काम करते हैं।

जवाबों:


211

मैंने इसे googling के माध्यम से हल किया:

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 से अधिक वर्णों को समाहित करना है? क्या यह आपकी समस्या या ObjectId () की आवश्यकता के लिए विशिष्ट है? क्या होगा अगर मेरे परम में 12 अक्षर नहीं हैं? धन्यवाद!
युसॉन्ग

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*/ })

Mongoose Queries के बारे में और पढ़ें ।


इसे प्यार करना! सर उठाने के लिए धन्यवाद!
zeckdude

0

MongoDB प्रलेखन के अनुसार: "... यही कारण है कि MongoDB के लिए एक $ या अभिव्यक्ति का मूल्यांकन करने के लिए अनुक्रमित का उपयोग करना है, $ या अभिव्यक्ति में सभी खंड अनुक्रमित द्वारा समर्थित होने चाहिए।"

तो अपने अन्य क्षेत्रों के लिए अनुक्रमित जोड़ें और यह काम करेगा। मुझे इसी तरह की समस्या थी और इसने इसे हल किया।

आप यहाँ और अधिक पढ़ सकते हैं: https://docs.mongodb.com/manual/reference/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
गोविन्द राय द्वारा आपका उत्तर एक से अलग कैसे है? क्या आप उन्हें अपने से बेहतर बनाता है?
BDL

async / प्रतीक्षा, कुछ भी नहीं यह बेहतर बनाता है?
फायरज

2
इस साइट पर कोड-ओनली उत्तर आमतौर पर दिए गए हैं। क्या आप अपने जवाब को अपने कोड की कुछ टिप्पणियों या स्पष्टीकरण को शामिल करने के लिए संपादित कर सकते हैं? स्पष्टीकरण में सवालों का जवाब देना चाहिए जैसे: यह क्या करता है? इसे यह कैसे करना है? यह कहाँ जाता है? यह ओपी की समस्या को कैसे हल करता है? देखें: कैसे anwser के लिए । धन्यवाद!
एडुआर्डो बैइटेलो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.