【问题标题】:elemMatch search on array of subdocumentelemMatch 搜索子文档数组
【发布时间】:2015-03-17 05:59:47
【问题描述】:

如何在 SubDocument 数组上使用 elemMatch 进行搜索?我有一个名为 ReportCollection 的文档,其中包含以下元素:-

/* 0 */
{
    "_id" : ObjectId("5507bfc435e9470c9aaaa2ac"),
    "owner" : ObjectId("5507bfc31e14d78e177ceebd"),
    "reports" : {
        "xReport" : [ 
            {
                "name" : "xReport",
                "parameters" : {
                    "x" : {
                        "dateTime" : "2015-03-11T18:30:00.000Z",
                        "unit" : 1,
                        "value" : 102
                    }
                },
                "createdBy" : ObjectId("5507bfc31e14d78e177ceebd"),
                "modifiedBy" : ObjectId("5507bfc31e14d78e177ceebd"),
                "_id" : ObjectId("5507bfc41e14d78e177ceebf")
            }
        ]
    }
}

我得到了reports.xReport[]._id 作为搜索参数。

我的以下尝试失败了:-

  db.reports.find ({ {owner: ObjectId("5507afd3d54bae3513c185cb")}, 
    { 'reports.xReport': {$elemMatch: {_id: ObjectId("5507afd3d54bae3513c185cd") }}} } )

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query node-mongodb-native


    【解决方案1】:

    您似乎正在尝试将工作投入到您应该在查询中进行的“投影”中。相反,您的陈述应该看起来更像这样:

    db.reports.find(
        {
            "owner": ObjectId("5507bfc31e14d78e177ceebd"),
            "reports.xReport._id": ObjectId("5507bfc41e14d78e177ceebf")
        },
        { "reports.xReport.$": 1 }
    )
    

    所以“查询”完成了匹配数组位置的工作,“投影”只是在匹配中使用该位置。

    还请注意,您永远不需要 $elemMatch 与单个字段进行匹配。只有当条件中需要多个字段时,您才需要使用它来匹配特定的“元素”。

    同理,这也应该在“查询”语句中。

    $elemMatch 的投影形式不能通过点分符号与子文档字段一起使用。

    【讨论】:

    • 谢谢 Niel,(实际上我的示例中的整个参数是查询的一部分,但我把它弄得太复杂了,正如我正确建议的那样,我不需要 $elemMatch。
    • @SutikshanDubey 我通常认为在上下文允许的情况下值得一提,因为它与您需要使用的各种其他运算符(特别是 $in$nin 等)一起是一个常见的误解处理数据中的数组时这样的运算符。这不仅仅是为了您的利益,而是在问答资源网站上,为了所有可能偶然发现相同问题的人的利益。友情提醒,接受能解决您问题的答案。您的帐户对您的问题的公认答案非常“轻”。
    • 嘿,我确实将它标记为已接受,不确定,为什么 SO 没有将答案标记为已接受。 (可能是我在两个浏览器窗口中打开了这个页面......)。我又试了一次,我希望它会被接受。谢谢伙计(在你的第一条评论之后,我还回顾了我的另一个问题:))。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2017-01-13
    相关资源
    最近更新 更多