Этого можно добиться, используя агрегат: этап агрегации addFields с оператором $ objectToArray , затем сопоставьте и удалите добавленное поле.
db['01'].aggregate(
[
{
$addFields: {
"newNode1":{$objectToArray:"$node1"}
}
},
{
$match: {
"newNode1.v.node3":"testa"
}
},
{
$project: {
newNode1:0
}
},
]
);
Это предоставит все документы, которые содержат "testa" в качестве значения node3.
$ addFields с $ objectToArray приведет к следующей структуре, затем $ match и удалит созданное поле с $ project.
{
"_id" : ObjectId("5b840cdf0b354c1b829a19fc"),
"node1" : {
"node2" : {
"node3" : "test"
},
"node2a" : {
"node3" : "testa"
},
"node2b" : {
"node3" : "test"
},
"node2c" : {
"node3" : "test"
},
"node2d" : {
"node3" : "testa"
}
},
"newNode1" : [
{
"k" : "node2",
"v" : {
"node3" : "test"
}
},
{
"k" : "node2a",
"v" : {
"node3" : "testa"
}
},
{
"k" : "node2b",
"v" : {
"node3" : "test"
}
},
{
"k" : "node2c",
"v" : {
"node3" : "test"
}
},
{
"k" : "node2d",
"v" : {
"node3" : "testa"
}
}
]
}