select 或从 collection 中清空

select or empty from collection

我想查找 ID 为 either or 护照号码的用户。

我的collection:

idNo    passportNo     Name
123456                 Kelvin
567890                 Andy

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

由于护照号码是空的,它会检索所有记录。我只想 return:

idNo    passportNo     Name
123456                 Kelvin

我想你的意思是 $exists,只要文档中存在该字段,它就会 return:

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

如果您的文档实际上 "do not" 具有任何形式的字段,则恰恰相反:

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

此外,所有查询参数都是隐含的 "and" 条件。只在同一个字段查询多个条件时才需要运算符。


总的来说,你的例子不是很清楚,也缺少 "deleted" 字段。假设它确实存在,那么您可能根本不需要 $or 条件,而只是:

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

或者只是:

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

所以就你的问题标题而言确实没有意义


看来你没有问你真正想问的问题。如果您正在处理类似表单输入的内容,那么您 "build" 根据提供的内容进行查询。

在 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);

这就是我们所说的 "building" 查询的意思,以及您最终似乎想要做的事情。

可能这就是你想要的

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

它可以处理 mangodb 本身的空值。您可以在不检查程序的情况下通过 idNo 和 passport no。