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

时间:2011-04-24 15:09:46

标签: mongodb

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

查询:

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})
db.test2.find({"invitations.code":"codeAA"}, {"invitations.acceptedDate": {$exists: false}})

这甚至是在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",
    }]
}]

干杯

的Nik

2 个答案:

答案 0 :(得分:5)

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

db.test2.find({"invitations.acceptedDate": {$exists: false}}, {"invitations.code":"codeAA"})

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

{
    "invitations.acceptedDate": {$exists: false},
    "invitations.code":"codeAA"
}

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

你可能还会得到用户的_id,因为你错误地应用了find的第二个属性。

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

  

“请给我一个用户列表   已使用代码发送了邀请   'codeAA'邀请没有   已声明(邀请不包含   一个接受的日期)“

您的查询应该是:

{
    invitations: {
        $elemMatch: {
            code: "codeAA",
            acceptedDate: {$exists: false}
        }
    }
}

答案 1 :(得分:2)

您正在将字段过滤器作为第二个参数传递给find()。 完整查询始终作为 first 参数传递。