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.