最近我开始在Nodejs上使用MongoDB和Mongoose。
当我使用带有$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 shell中,两者都能正常工作。
答案 0 :(得分:161)
我通过谷歌搜索解决了这个问题:
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);
});
答案 1 :(得分:22)
我恳请大家使用Mongoose的查询构建器语言和承诺而不是回调:
User.find().or([{ name: param }, { nickname: param }])
.then(users => { /*logic here*/ })
.catch(error => { /*error logic here*/ })
详细了解Mongoose Queries。
答案 2 :(得分:0)
根据mongoDB文档:“......也就是说,对于MongoDB使用索引来计算$或表达式,$或表达式中的所有子句必须由索引支持。”
因此,为其他字段添加索引,它将起作用。我有类似的问题,这解决了它。
您可以在此处阅读更多内容:https://docs.mongodb.com/manual/reference/operator/query/or/
答案 3 :(得分: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 */