Mongodb 将数组转换为具有n个属性的文档映射的查询
我正在将一个数组转换为mongo中的地图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":
"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"
}
}
}
}
}
}
])