Метод поиска Mongoose с условием $ или не работает должным образом

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

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

Я решил это через 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); }); 

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

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

Подробнее о запросах Mongoose .

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

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

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