在 mongoDB (2.4) 中我有集合students
里面有一堆文件。每个文档的结构如下:
{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
},
{
"_id" : ObjectId("55fc6d200d6097e98b210bff"),
"createdOn" : ISODate("2015-09-18T19:59:28.439Z"),
"fromUser" : ObjectId("55f721d1e1242e7c4c129471"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}
现在,我需要从消息数组中取出一个子文档,例如messages._id
equal 55fc60bc260c9be5879ef733
所以我用$elemMatch
:
db.users.find({"_id": new ObjectId('55f16640a17eed480bb0dc18'),
"messages": {
$elemMatch:{
"_id": new ObjectId('55fc60bc260c9be5879ef733'),
"fromUser": new ObjectId('55f16a6af9c703280c5b2c0e'),
"toUser": new ObjectId('55f16640a17eed480bb0dc18'),
"type": 1
}}}).pretty();
但这给了我:
{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
},
{
"_id" : ObjectId("55fc6d200d6097e98b210bff"),
"createdOn" : ISODate("2015-09-18T19:59:28.439Z"),
"fromUser" : ObjectId("55f721d1e1242e7c4c129471"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}
如果我正确理解文档http://docs.mongodb.org/v2.4/reference/operator/projection/elemMatch/我应该只收到:
{
"_id" : ObjectId("55f16640a17eed480bb0dc18"),
"messages" : [
{
"_id" : ObjectId("55fc60bc260c9be5879ef733"),
"createdOn" : ISODate("2015-09-18T19:06:36.793Z"),
"fromUser" : ObjectId("55f16a6af9c703280c5b2c0e"),
"toUser" : ObjectId("55f16640a17eed480bb0dc18"),
"type" : 1
}
]
}
那么我做错了什么?