我是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)
干杯
聂
如果你看一下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)
| 归档时间: |
|
| 查看次数: |
478 次 |
| 最近记录: |