MongoDB:在对象中使用变量键查询值

时间:2017-07-11 21:19:17

标签: mongodb aggregation-framework

在尝试使用变量键在对象中检索字段值时遇到了困难,例如:

运行命令:

db.stuff.find()

会给:

{  
   "_id":ObjectId("5963e65f948dc563d6375f7b"),
   "color_map":{  
      "APPLE":"red",
      "BANANA":"yellow",
      "SKY":"blue"
   },
   "type":"APPLE"
}
{  
   "_id":ObjectId("5963e65f948dc563d6375f77"),
   "color_map":{  
      "BANANA":"yellow",
      "PEACH":"pink",
      "SKY":"blue"
   },
   "type":"PEACH"
}

所以问题是,如何使用纯MongoDB运算符(更喜欢使用聚合运算符)获得颜色结果,以获得以下结果:

{  
   "_id":ObjectId("5963e65f948dc563d6375f7b"),
   "type":"APPLE",
   "color":"red"
}
{  
   "_id":ObjectId("5963e65f948dc563d6375f77"),
   "type":"PEACH",
   "color":"pink"
}

后续:mongoDB版本是3.2.9,升级到最新版本会导致其他组件崩溃,所以我们可以在不使用$ objectToArray(3.4.4中的新增内容)的情况下实现它吗?

1 个答案:

答案 0 :(得分:0)

您可以使用$objectToArraycolor_map嵌入式文档转换为k v版本中的键值(3.4.4)对数组。

$indexOfArray运算符在type's中找到匹配的color_map索引,后跟$arrayElemAt,以检索找到的索引处的元素,并将元素的值投影到{{1} } field。

color$let表达式中创建colorkvs变量和引用。

如下所示

in

您可以通过删除外部db.collectionname.aggregate([ { "$project": { "color": { "$let": { "vars": { "colorkvs": { "$objectToArray": "$color_map" } }, "in": { "$let": { "vars": { "colorkv": { "$arrayElemAt": [ "$$colorkvs", { "$indexOfArray": [ "$$colorkvs.k", "$type" ] } ] } }, "in": "$$colorkv.v" } } } }, "type":1 } } ]) 表达式缩短管道。

$let

较低版本的JS解决方案

db.collectionname.aggregate([
  {
    "$project": {
      "color": {
        "$let": {
          "vars": {
            "colorkv": {
              "$arrayElemAt": [
                {
                  "$objectToArray": "$color_map"
                },
                {
                  "$indexOfArray": [
                    {
                      "$objectToArray": "$color_map"
                    },
                    "$type"
                  ]
                }
              ]
            }
          },
          "in": "$$colorkv.v"
        }
      },
      "type": 1
    }
  }
])