首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在双嵌套数组MongoDB中查找?

如何在双嵌套数组MongoDB中查找?
EN

Stack Overflow用户
提问于 2018-06-05 00:50:28
回答 2查看 0关注 0票数 0

我在MongoDB中有这个代码:

代码语言:javascript
运行
复制
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
    {
        "name" : "name1",
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
  ]
}

我想找到基于someArray.someNestedArray.name的文档,但我找不到任何有用的链接关于更新嵌套数组的所有搜索结果我正在尝试这个,但没有返回:

代码语言:javascript
运行
复制
db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})

我怎么能找到由双嵌套数组MongoDB中的元素?

EN

回答 2

Stack Overflow用户

发布于 2018-06-05 09:17:09

下面的查询用于用已更新的内容$addFields覆盖现有someArray的内容someArray

更新someArray通过使用创建$map + $filter$map阶段保留现有值并$filter过滤someNestedArray仅保留匹配值。

使用$project而不是$addFieldsin 3.2版本中

代码语言:javascript
运行
复制
db.collection.aggregate([
{
    $addFields: {
        someArray: {
            $map: {
                input:"$someArray",
                as: "resultm",
                in: {
                   name: "$$resultm.name",
                   someNestedArray: {
                        $filter: {
                            input: "$$resultm.someNestedArray",
                            as: "resultf",
                            cond: {
                                $eq: ["$$resultf.name", "value"]
                            }
                        }
                    }
                }
            }
        }
    }
}
])
票数 0
EN

Stack Overflow用户

发布于 2018-06-05 10:39:23

从最简单的意义上讲,这跟MongoDB使用的“点符号”的基本形式相同。无论内部数组成员在哪个数组成员中,只要它匹配一个值就可以工作:

代码语言:javascript
运行
复制
db.mycollection.find({
    "someArray.someNestedArray.name": "value"
})

对于“单个字段”值来说,这很好,用于匹配你要使用的多个字段$elemMatch

代码语言:javascript
运行
复制
db.mycollection.find({
    "someArray": { 
        "$elemMatch": {
            "name": "name1",
            "someNestedArray": {
                "$elemMatch": {
                    "name": "value",
                    "otherField": 1
                }
            }
        }
    }
})

Modern MongoDB

我们可以通过应用做到这一点$filter,并$map在这里。这$map是非常必要的,因为“内部”数组可以因“过滤”而改变,而“外部”数组当然与“内部”被除去所有元素时的条件不匹配。

再次遵循实际具有多个属性以在每个数组内匹配的示例:

代码语言:javascript
运行
复制
db.mycollection.aggregate([
  { "$match": {
    "someArray": {
      "$elemMatch": {
         "name": "name1",
         "someNestedArray": {
           "$elemMatch": {
             "name": "value",
             "otherField": 1
           }
         }
       }
    }
  }},
  { "$addFields": {
    "someArray": {
      "$filter": {
        "input": {
          "$map": {
            "input": "$someArray",
            "as": "sa",
            "in": {
              "name": "$$sa.name",
              "someNestedArray": {
                "$filter": {
                  "input": "$$sa.someNestedArray",
                  "as": "sn",
                  "cond": {
                    "$and": [
                      { "$eq": [ "$$sn.name", "value" ] },
                      { "$eq": [ "$$sn.otherField", 1 ] }
                    ]
                  }
                }
              }             
            }
          },
        },
        "as": "sa",
        "cond": {
          "$and": [
            { "$eq": [ "$$sa.name", "name1" ] },
            { "$gt": [ { "$size": "$$sa.someNestedArray" }, 0 ] }
          ]
        }
      }
    }
  }}
])

Older MongoDB

为了“只”投影匹配的元素,你需要的.aggregate()方法是:

代码语言:javascript
运行
复制
db.mycollection.aggregate([
    // Match possible documents
    { "$match": {
        "someArray.someNestedArray.name": "value"
    }},

    // Unwind each array
    { "$unwind": "$someArray" },
    { "$unwind": "$someArray.someNestedArray" },

    // Filter just the matching elements
    { "$match": {
        "someArray.someNestedArray.name": "value"
    }},

    // Group to inner array
    { "$group": {
        "_id": { 
            "_id": "$_id", 
            "name": "$someArray.name"
        },
        "someKey": { "$first": "$someKey" },
        "someNestedArray": { "$push": "$someArray.someNestedArray" }
    }},

    // Group to outer array
    { "$group": {
        "_id": "$_id._id",
        "someKey": { "$first": "$someKey" },
        "someArray": { "$push": {
            "name": "$_id.name",
            "someNestedArray": "$someNestedArray"
        }}
    }} 
])

这使你可以为嵌套数组中的匹配“过滤”文档中的一个或多个结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004744

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档