Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 将数组转换为具有n个属性的文档映射的查询_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 将数组转换为具有n个属性的文档映射的查询

Mongodb 将数组转换为具有n个属性的文档映射的查询,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我正在将一个数组转换为mongo中的地图 "items":[ { "id":"AB-02", "qty":2 }, { "id":"AB-03", "qty":0 }, { "id":"AB-03", "qty":9 } ] 变成 "items":{ "AB-02":{ "id":"AB-02", "qty":

我正在将一个数组转换为mongo中的地图

  "items":[  
    {  
      "id":"AB-02",
      "qty":2
    },
    {  
      "id":"AB-03",
      "qty":0
    },
    {  
      "id":"AB-03",
      "qty":9
    }
  ]
变成

 "items":{  
    "AB-02":{  
      "id":"AB-02",
      "qty":2
    },
    "AB-03":{  
      "id":"AB-03",
      "qty":0
    },
    "AB-04":{  
      "id":"AB-03",
      "qty":9
    }
  }

在数组版本中,根据
中的元素数量进行查询非常容易,但如何使用
的后一种格式进行查询?如中所述,要从MongoDB 3.4.4及更高版本中查询其
包含7个元素的文档?

,可以使用操作符将数组转换为单个文档,数组应该是包含两个字段的文档列表,
k
v
其中:

k
字段包含字段名

v
字段包含该字段的值

因此,您需要创建一个管道,首先从

"items":[  
    {  
      "id":"AB-02",
      "qty":2
    },
    {  
      "id":"AB-03",
      "qty":0
    },
    {  
      "id":"AB-03",
      "qty":9
    }
]

正确地使用表达式执行该操作

"$map": {
    "input": "$items",
    "as": "item",
    "in": {
        "k": "$$item.id",
        "v": "$$item"
    }                            
}
因此,您的最终管道可以使用将上述所有操作符包装到单个阶段,如下所示:

db.collection.aggregate([
    {
        "$addFields": {
            "items": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$items",
                        "as": "item",
                        "in": {
                            "k": "$$item.id",
                            "v": "$$item"
                        }                            
                    }
                }
            }
        }
    }
])

您的MongoDB服务器版本是什么?我当前的版本是2.6,恐怕您需要使用MapReduce,否则请将您的版本升级到3.4.4或最新版本,以便您可以利用聚合框架中的
$arrayToObject
操作符进行转换。我在下面写了一个答案,以防您想知道如何在您的案例中应用运算符,并为将来的读者着想。升级到3.6,然后使用
$objectToArray
$arrayToObject
来实现您的结果。@RahulRaj只是好奇,
$objectToArray
如何帮助实现上述结果?
db.collection.aggregate([
    {
        "$addFields": {
            "items": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$items",
                        "as": "item",
                        "in": {
                            "k": "$$item.id",
                            "v": "$$item"
                        }                            
                    }
                }
            }
        }
    }
])