Метод поиска Mongoose с $ или условием не работает должным образом - PullRequest
84 голосов
/ 12 сентября 2011

Недавно я начал использовать MongoDB с Mongoose на Nodejs.

Когда я использую метод Model.find с условием $or и полем _id, 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 оба работают нормально.

Ответы [ 3 ]

164 голосов
/ 13 сентября 2011

Я решил это через поиск в Google:

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);
});
23 голосов
/ 20 января 2018

Я умоляю всех использовать язык конструктора запросов Mongoose и обещания вместо обратных вызовов:

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

Подробнее о Запросы Mongoose .

0 голосов
/ 17 ноября 2017

Согласно документации mongoDB: «... То есть, чтобы MongoDB использовал индексы для вычисления выражения $ или, все выражения в выражении $ или должны поддерживаться индексами».

Так что добавьте индексы для других ваших полей, и это будет работать. У меня была похожая проблема, и это решило ее.

Вы можете прочитать больше здесь: https://docs.mongodb.com/manual/reference/operator/query/or/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...