我对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
答案 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 参数传递。