MongoDB在文档数组中查找所有字典

时间:2019-02-06 15:48:11

标签: mongodb

{
    "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. 查找文档
  3. 在我们在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仅返回数组中的一个字典。但是我想获取所有符合查询条件的命令

1 个答案:

答案 0 :(得分: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文档。

更新:

我意识到您 还想投影结果文档,因为array字段仅包含匹配的元素。现在,我们只需要将您的原始投影与新查询结合起来

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,这只会返回 first 匹配数组元素,而不是 all 匹配元素。

如果您需要进一步简化数据,我建议使用聚合框架,因为这些运算符更可靠。

可能看起来像

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

您可以在以下位置找到有关这些运算符的文档: