使用$或condition的Mongoose的find方法无法正常工作

You*_*han 95 mongoose mongodb node.js

最近我开始在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);
});
Run Code Online (Sandbox Code Playgroud)

顺便说一句,如果我删除'_id'部分,这就行了!

User.find({
  $or: [
    { 'name': param },
    { 'nickname': param }
  ]
}, function(err, docs) {
   if(!err) res.send(docs);
});
Run Code Online (Sandbox Code Playgroud)

而在MongoDB shell中,两者都能正常工作.

You*_*han 185

我通过谷歌搜索解决了它:

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);
});
Run Code Online (Sandbox Code Playgroud)

  • 您可以将其标记为问题的答案. (15认同)
  • 你也可以检查ObjectId如下:`const mongoose = require('mongoose'); mongoose.Types.ObjectId.isValid(objectidtocheck)` (5认同)
  • 您能否用文字描述这种解决方案的原因?谢谢 (2认同)

Gov*_*Rai 34

我恳请大家使用Mongoose的查询构建器语言并承诺而不是回调:

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

阅读有关Mongoose查询的更多信息.


All*_*lJs 7

您还可以混合添加$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);
    }
);
Run Code Online (Sandbox Code Playgroud)

因此,这意味着您的 find() 将查找 (_id = idParam OR name = nameParam ORnickname = NickParam) AND (age = AgeParam) 的所有用户

我希望这对那里的人有帮助。干杯!!!