为什么 MongoDB $elemMatch 返回数组中的所有元素?

2023-12-09

在 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
        }
    ]
}

那么我做错了什么?


您没有使用投影运算符$elemMatch匹配,但是query操作员$elemMatch

换句话说,你不投影任何东西,而是使用$elemMatch用于过滤查询应返回的结果。

为了使您的投影正常工作,您应该将查询更改为以下内容:

db.users.find(
    {"_id": new ObjectId('55f16640a17eed480bb0dc18')},
    {"messages": {$elemMatch:{"_id": new ObjectId('55fc60bc260c9be5879ef733')}}}
).pretty();

上面的查询应该返回 _id 字段(与查询子句中出现的相同),以及投影子句中提到的 id 的数组元素

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 MongoDB $elemMatch 返回数组中的所有元素? 的相关文章

随机推荐