我有一个具有以下格式的数组:
data{
[sequentialId]{guid:value1,name:value2}
}
我需要做类似db.data.find(“ data。?。name”:“ value1”)
我见过的所有解决方案都行不通,因为他们希望我知道属性的名称,但是在这种情况下,ID是连续的。
我已经研究了查询此处描述的嵌套文档的标准方法 https://docs.mongodb.com/manual/tutorial/query-array-of-documents/ 我还查看了$ unwind之类的一些选项,但是我什么也无法工作
这是一个小样本
{"41":{"b":453081600,"f":1,"h":171,"s":4,"w":4,"wr":[2,0]},
"80":{"b":337132800,"f":2,"h":169,"s":4,"w":4,"wr":[0,0]},
"388":{"b":148694400,"f":1,"h":188,"l":{"c":[{"e":2001,"g":13,"m":292,"s":1992,"t":18},{"e":2006,"g":11,"m":197,"s":2001,"t":1},{"e":2009,"g":2,"m":111,"s":2006,"t":1790},{"e":2009,"g":0,"m":1,"s":2009,"t":1937},{"e":2010,"g":1,"m":14,"s":2010,"t":1},{"e":2011,"g":0,"m":8,"s":2010,"t":13}],"n":[{"e":2007,"g":1,"m":73,"s":1996,"t":1318}]},"s":2,"w":3,"wr":[0,0]}}
例如在这组数据中,我可能需要查询“ f” = 1
的所有文档答案 0 :(得分:0)
以下查询可以为我们提供预期的输出:
注意::我们正在提取name
等于a
db.collection.aggregate([
{
$addFields:{
"filtered":{
$filter:{
"input":"$data",
"as":"info",
"cond":{
$let:{
"vars":{
"array":{
$objectToArray:"$$info"
}
},
"in":{
$in:["a","$$array.v.name"]
}
}
}
}
}
}
},
{
$match:{
"filtered.0":{
$exists:true
}
}
},
{
$project:{
"filtered":0
}
}
]).pretty()
数据集:
{
"data":[
{
"41": {
"b": 453081600,
"name": "a"
},
"80": {
"b": 337132800,
"name": "b"
},
"388": {
"b": 148694400,
"name": "c"
}
}
]
}
{
"data":[
{
"41": {
"b": 453081600,
"name": "b"
},
"80": {
"b": 337132800,
"name": "b"
},
"388": {
"b": 148694400,
"name": "c"
}
}
]
}
输出:
{
"data":[
{
"41": {
"b": 453081600,
"name": "a"
},
"80": {
"b": 337132800,
"name": "b"
},
"388": {
"b": 148694400,
"name": "c"
}
}
]
}
查询分析:
data
数组中的那些记录,该记录包含name
等于a
的任何带有未知键的子文档中的记录。 data
的每个文档转换为键值对数组。现在,我们可以直接查询值,而不必担心键。filtered
数组的大小大于零的那些文档。