社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  MongoDB

从MongoDB(v3.4)文档中仅获取子数组[副本]

Anshul Jain • 5 年前 • 1678 次点击  

我在MongoDB中有这个收藏

{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
    {
        "name" : "name1",
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
  ]
}

我想查找基于somearray.somenestedarray.name的文档 但是我找不到任何有用的链接所有关于更新嵌套数组的搜索结果 我在试,但什么都不退

db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})

还有别的东西

如何在双嵌套数组mongodb中找到by元素?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/40215
 
1678 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Jitendra
Reply   •   1 楼
Jitendra    6 年前

您也可以尝试以下操作:

db.collection.aggregate(
    { $unwind: '$someArray' },
    {
        $project: {
            'filteredValue': {
                $filter: {
                  input: "$someArray.someNestedArray",
                  as: "someObj",
                  cond: { $eq: [ '$$someObj.name', 'delete me' ] }
                }
            }
        }
    }
)
Neil Lunn
Reply   •   2 楼
Neil Lunn    8 年前

在最简单的意义上,这只是遵循了 "dot notation" 如MongoDB所用。无论内部数组成员在哪个数组成员中,只要它匹配一个值,它都可以工作:

db.mycollection.find({
    "someArray.someNestedArray.name": "value"
})

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

db.mycollection.find({
    "someArray": { 
        "$elemMatch": {
            "name": "name1",
            "someNestedArray": {
                "$elemMatch": {
                    "name": "value",
                    "otherField": 1
                }
            }
        }
    }
})

它与文档匹配,该文档将包含与值匹配的“路径”处的字段。如果您打算“匹配并过滤”结果,因此只返回匹配的元素,那么位置运算符投影不可能这样做, as quoted :

嵌套数组

位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$占位符的替换是单个值

现代MongoDB

我们可以通过申请 $filter $map 在这里。这个 美元地图 是真正需要的,因为“内部”数组可以由于“过滤”而改变,“外部”数组当然与“内部”被剥夺所有元素时的条件不匹配。

再次遵循在每个数组中实际要匹配多个属性的示例:

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

因此在“外部”数组上 滤器 实际上是看 $size 在“内部”数组本身被“过滤”之后,所以当整个内部数组实际上与noting匹配时,可以拒绝这些结果。

旧版MongoDB

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

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

它允许您为文档中的一个或多个结果“筛选”嵌套数组中的匹配项。