MongoDB的找到所有的字典在文档的数组

问题描述 投票:0回答:1
{
    "name": "sample_config222",
    "data": [
        {
            "id": 1,
            "first_name": "George",
            "last_name": "Bluth",
        },
        {
            "id": 2,
            "first_name": "Janet",
            "last_name": "Bluth",
        },
    ]
}

我想找到一个文件中匹配key: value所有词典。这里是两件事情,

  1. 找到"name": "sample_config222"文档
  2. 在文件阵列搜索词典,我们在1选择。

我试过了

db.config.find({name: "sample_config"}, {"data": { $elemMatch: { "last_name": "Bluth" } } })

它仅示出一个词典,其是第一个

{
    "name": "sample_config222",
    "data": [
        {
            "id": 1,
            "first_name": "George",
            "last_name": "Bluth",
        }
}

并且还越来越结果从其他文档中包含"last_name": "Bluth"

我试图与$and其表示整个文档。

更新:

存在使用here仅返回一个在阵列字典类似的问题$elematch。但我想获得两者匹配查询所有类型的字典

mongodb
1个回答
1
投票

您所提供的查询,

db.config.find({name: "sample_config"}, {"data": { $elemMatch: { "last_name": "Bluth" } } })

打破了这个

  1. 找到所有文件,其中名称是sample_config
  2. 项目仅领域,其中data.last_name等于Bluth

这里的关键是,find的方法需要多个参数。

function (query, fields, limit, skip, batchSize, options)

这些可以通过在壳执行find命令不带括号中找到。这适用于所有的shell命令,如果你忘记了怎么使用一个命令是非常有用的。

db.config.find

为了得到你想要的结果,你需要查询改成这样:

{name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }

请注意,我删除}"sample_config"{之前删除"data",使之成为find命令而不是queryproject文档中的单个查询文档。

更新:

我知道你还希望投影的结果文档做阵列场只包含匹配的元素。现在,我们只需要原来的投影与新的查询相结合

db.col.find({name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }, {"data": { $elemMatch: { "last_name": "Bluth" } } })

这将返回表格的文件

{
    _id: xxx,
    data: [
       { id: xxx, first_name: xxx, last_name: "Bluth" }
    ]
}

然而,根据the docs,这将只返回第一匹配的数组元素,不是所有的匹配元素。

如果您需要进一步向下突出的数据,我会建议使用的聚合框架,因为这些运营商更稳健。

这可能看起来像

db.col2.aggregate({$match: {name: "sample_config", "data": { $elemMatch: { "last_name": "Bluth" } } }},{$unwind:"$data"},{$match:{"data.last_name": "Bluth"}},{$replaceRoot:{newRoot:"$data"}})

这会导致下面的输出

{ "id" : 1, "first_name" : "George", "last_name" : "Bluth" }
{ "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" }
{ "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" }

从这些原始凭证

{ "_id" : ObjectId("5c5b025fea781cb935c975ae"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Bluth" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" } ] }
{ "_id" : ObjectId("5c5b0283ea781cb935c975af"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Dole" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Bluth" } ] }
{ "_id" : ObjectId("5c5b028bea781cb935c975b0"), "name" : "sample_config", "data" : [ { "id" : 1, "first_name" : "George", "last_name" : "Dole" }, { "id" : 2, "first_name" : "Janet", "last_name" : "Johnson" } ] }

您在这里可以找到这些操作符的文档:

© www.soinside.com 2019 - 2024. All rights reserved.