在尝试使用变量键在对象中检索字段值时遇到了困难,例如:
运行命令:
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中的新增内容)的情况下实现它吗?
答案 0 :(得分:0)
您可以使用$objectToArray
将color_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
}
}
])