Mongoose'un $ veya koşullu bulma yöntemi düzgün çalışmıyor


116

Son zamanlarda MongoDB'yi Nodejs üzerinde Mongoose ile kullanmaya başladım.

Model.find yöntemini kullandığımda $or koşul ve _idalan Mongoose düzgün çalışmıyor.

Bu çalışmıyor:

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

Bu arada, '_id' kısmını kaldırırsam bu İŞE ÇALIŞIR!

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

Ve MongoDB kabuğunda her ikisi de düzgün çalışıyor.

Yanıtlar:


211

Googling yoluyla çözdüm:

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
bu çözümün neden kelimelerle çalıştığını açıklayabilir misin? teşekkürler
Alexander Mills

Bu, oldukça spesifik bir sorunun çözümü gibi görünüyor. Aramaya devam etmen gerekebilir.
Kesarion

Referans verebilir misiniz? Neden bu durumda param 12'den fazla karakter içermelidir? Bu, probleminize mi yoksa ObjectId () gereksinimine mi özgü? Ya parametremde 12 karakter yoksa? Teşekkürler!
yusong

6
Ayrıca ObjectId'i aşağıdaki gibi kontrol edebilirsiniz:const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)
Orhan

@yusong, mongoose nedeniyle geçerli bir ObjectId değilse bir hata atacaktır. Bunu yapmanın daha temiz bir yolu yukarıda bahsetti.
Haydar Ali İsmail

53

Herkese Mongoose'un sorgu oluşturucu dilini kullanmaları için yalvarıyorum ve geri aramalar yerine sözler veriyorum:

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

Mongoose Sorguları hakkında daha fazla bilgi edinin .


Sevdim! Söylediğin için teşekkürler!
zeckdude

0

MongoDB belgelerine göre: "... Yani, MongoDB'nin bir $ veya ifadeyi değerlendirmek için dizinleri kullanması için, $ veya ifadedeki tüm tümcecikler dizinlerle desteklenmelidir."

Yani diğer alanlarınız için dizinler ekleyin ve işe yarayacaktır. Benzer bir problemim vardı ve bu onu çözdü.

Buradan daha fazlasını okuyabilirsiniz: https://docs.mongodb.com/manual/reference/operator/query/or/


1
bu yanlış bir ifadedir - yalnızca kullanılması gereken dizinlere ihtiyacınız varsa, yani performans için, bir koleksiyon taramasından kaçınmak için dizinlere ihtiyacınız vardır. Ancak performans bir sorun değilse (örneğin koleksiyon oldukça küçükse), o zaman önemli değil ..
Andy Lorenz

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
Cevabınız Govind Rai'nin yanıtından nasıl farklı? Sizinkini onlardan üstün kılan nedir?
BDL

async / await, hiçbir şey onu üstün kılmaz?
Firez

2
Yalnızca kod yanıtları bu sitede genellikle hoş karşılanmaz. Lütfen cevabınızı kodunuz hakkında bazı yorumlar veya açıklamalar içerecek şekilde düzenler misiniz? Açıklamalar aşağıdaki gibi sorulara cevap vermelidir: Ne işe yarar? Bunu nasıl yapıyor? Nereye gidiyor? OP'nin problemini nasıl çözer? Bakınız: Nasıl cevaplanır . Teşekkürler!
Eduardo Baitello
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.