从集合中选择或清空

时间:2015-03-18 07:27:22

标签: mongodb mongoose mongodb-query

我希望找到either身份or护照号码的用户。

我的收藏:

idNo    passportNo     Name
123456                 Kelvin
567890                 Andy

User.find({'$and':[{deleted: false}, {'$or': [{idNo: '123456'}, {passportNo: ''}]}]}

由于护照号码为空,它将检索所有记录。我只是想让它回归:

idNo    passportNo     Name
123456                 Kelvin

2 个答案:

答案 0 :(得分:1)

我认为你的意思是$exists,只要该字段出现在文档中,它就会返回:

User.find({
    "deleted": false,
    "$or": [
        { "idNo": "123456" },
        { "passportNo": { "$exists": true } }
    ]
})

如果你的文件实际上“不”以任何形式出现这个字段,那就恰恰相反:

        { "passportNo": { "$exists": false } }

此外,所有查询参数都隐式为“和”条件。在同一领域要求多个条件时,您只需要操作员。


一般来说,您的示例不是很清楚,也缺少“已删除”字段。假设它实际存在,那么你可能根本不需要 $or 编码,只是:

User.find({
    "deleted": false,
    "idNo": "123456",
    "passportNo": { "$exists": false }
})

或者只是:

User.find({
    "deleted": false,
    "idNo": "123456",
})

因此,就问题的标题而言,它真的没有意义


看来你没有问你实际意思的问题。如果您正在处理类似表单输入的内容,那么您可以根据提供的内容“构建”查询。

在JavaScript上下文中,您可能正在使用express,所以最终会得到类似这样的内容:

var query = {
    "deleted": false
};

if ( req.params.idNo != '' )
    query.idNo = req.params.idNo;

if ( req.params.passportNo != '' )
    query.passportNo = req.params.passportNo;

User.find(query);

这就是我们所谓的“构建”查询,以及您最终想要做的事情。

答案 1 :(得分:0)

可能这就是你想要的

 db.User.find({$or: [{idNo: 123123},{$and:[{passportNo:{$ne:''}},{passportNo:1232}]}]})

它可以处理mangodb本身的空值。没有检查程序,你可以传递idNo和护照号码。