Mongoose 的具有 $或条件的 find 方法不能正常工作

最近我开始在 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 中,两者都能正常工作。

208512 次浏览

我通过谷歌解决了这个问题:

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*/ })

了解更多关于 猫鼬查询的信息。

你也可以混合使用 $orand来增加你的功能的灵活性、选项和健壮性,如下所示:

var ObjectId = require("mongoose").Types.ObjectId;
var idParam = new ObjectId(param.length < 12 ? "123456789012" : param);
const {nameParam, nicknameParam, ageParam} = req.params || req.body || req.query


User.find({
$or: [{
_id: objId
},
{
name: nameParam
},
{
nickname: nicknameParam
}
],
$and: [{
age: ageParam
}]
},
function (err, docs) {
if (!err) res.send(docs);
}
);

这意味着 find ()将查找(_ id = idParam 或 name = nameParam 或昵称 = nicknameParam) AND (age = ageParam)的所有用户

我希望这能帮到别人。 干杯! ! !