MongoDB查询问题:如何通过一个字段表示选择有一个值而另一个字段没有设置?

nik*_*ers 1 mongodb

我是Mongo的新手,我不太明白:
为什么,对于集合test2中的以下项目,第一个查询有效,但第二个查询无效?
为什么查询只给我用户的_id,而不是用户的全部内容,而它确实给了我使用邀请的所有信息?

查询:

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})
db.test2.find({"invitations.code":"codeAA"}, {"invitations.acceptedDate": {$exists: false}})
Run Code Online (Sandbox Code Playgroud)

这甚至是在Mongo中表达查询的正确方法吗?我正在尝试编写的查询是:

"请给我一个使用代码'codeAA'发送邀请的用户列表,其中未邀请邀请(邀请不包含已接受的日期)"

数据:

[{
    "username": "userA",
    "password": "secretA",
    "invitations": [{
        "code": "codeAA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeAB",
        "emailSentTo": "test@me.com",
        "acceptedDate": "20110424"
    }]},
{
    "username": "userB",
    "password": "secretB",
    "invitations": [{
        "code": "codeBA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeBB",
        "emailSentTo": "test@me.com",
    }]},
{
    "username": "userC",
    "password": "secretC",
    "invitations": [{
        "code": "codeCA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeAA",
        "emailSentTo": "test@me.com",
        "acceptedDate": "20110424"
    }]},
{
    "username": "userD",
    "password": "secretD",
    "invitations": [{
        "code": "codeDA",
        "emailSentTo": "test1@me.com",
    },{
        "code": "codeDB",
        "emailSentTo": "test@me.com",
    }]
}]
Run Code Online (Sandbox Code Playgroud)

干杯

聂

roc*_*000 5

如果你看一下find方法的mongodb文档,你会发现它希望你的查询作为第一个参数,并希望在第二个参数中选择字段列表.所以在你第一次打电话找

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})
Run Code Online (Sandbox Code Playgroud)

仅"invitations.acceptedDate": {$exists: false}适用于您的查询,但{"invitations.code":"codeAA"}不属于该条件.您可能希望将所有条件放在一个查询对象中:

{
    "invitations.acceptedDate": {$exists: false},
    "invitations.code":"codeAA"
}
Run Code Online (Sandbox Code Playgroud)

并将其作为第一个和唯一的参数传递给查找.

可能还有一点是你只得到了用户的_id,因为你错误地应用了find的第二个属性.

编辑:如果您希望具有匹配多个条件的单个数组元素的文档,请使用$ elemMatch.所以对于你的问题:

"请给我一个使用代码'codeAA'发送邀请的用户列表,其中未邀请邀请(邀请不包含已接受的日期)"

您的查询应该是这样的:

{
    invitations: {
        $elemMatch: {
            code: "codeAA",
            acceptedDate: {$exists: false}
        }
    }
}
Run Code Online (Sandbox Code Playgroud)