我在MongoDB中具有以下结构。我想按特定值获取密钥。
例如如果v ='Item Information'中的值,我希望结果为A1
我没有什么限制
1.键名A1,E1 =将是动态的
2.其中的“ v”值将始终存在
对此应查询什么?
答案 0 :(得分:1)
要处理动态键,您可以尝试如下操作:
db.collection.aggregate([
{
$unwind: "$sheet"
},
{
$project: {
"sheetData": { $objectToArray: "$sheet" }
}
},
{
$match: {
"sheetData.v": { $elemMatch: { v: 'Item Information' } },
}
},
{
$project: {
result: "$sheetData.k"
}
}
])
上面的查询将给出包含"v": "Item Information"
结果如下:
{
"_id" : ObjectId("5d020542c366c914650be72e"),
"result" : [
"A1"
]
}
我想让您知道,我正在尝试所有上述查询,然后只将其与结果JSON一起发布。因此,可能只有一个错误,我们俩都在使用不同的文档结构,因此请使用下面的虚拟Doc匹配您的结构。
{
"_id" : ObjectId("5d020542c366c914650be72e"),
"sheet" : [
{
"A1" : [
{
"t" : "value"
},
{
"v" : "Item Information"
},
{
"r" : "value"
},
{
"h" : "value"
},
{
"w" : "value"
}
]
},
{
"E1" : [
{
"t" : "value"
},
{
"v" : "value"
},
{
"r" : "value"
},
{
"h" : "value"
},
{
"w" : "value"
}
]
}
]
}
答案 1 :(得分:0)
请尝试如下搜索在“ sheet.A1”中包含“ v”:“项目信息”的提取文档。
db.collection.aggregate([
{
$unwind: "$sheet"
},
{
$match: {
"sheet.A1": { $elemMatch: { v: 'Item Information' } },
}
}
])
如果您需要其他帮助,请告诉我,我将更新查询。
我正在使用虚拟文档,如下所示:
{
"_id" : ObjectId("5d020542c366c914650be72e"),
"sheet" : [
{
"A1" : [
{
"t" : "value"
},
{
"v" : "Item Information"
},
{
"r" : "value"
},
{
"h" : "value"
},
{
"w" : "value"
}
]
},
{
"E1" : [
{
"t" : "value"
},
{
"v" : "value"
},
{
"r" : "value"
},
{
"h" : "value"
},
{
"w" : "value"
}
]
}
]
}
上述查询的结果如下:
{
"_id" : ObjectId("5d020542c366c914650be72e"),
"sheet" : {
"A1" : [
{
"t" : "value"
},
{
"v" : "Item Information"
},
{
"r" : "value"
},
{
"h" : "value"
},
{
"w" : "value"
}
]
}
}