从另一个json对象中的json对象进行mongodb搜索
考虑这份文件:从另一个json对象中的json对象进行mongodb搜索,mongodb,Mongodb,考虑这份文件: { "id":1, "name":"A", "lastName":"AA", "friends":{ "f1":{"name":"X", "lastName":"XX"}, "f2":{"name":"Y", "lastName":"YY"} } } 我想搜索名为“Y”的朋友,但不知道钥匙是“f2”。。。钥匙可以是任何东西。我知道我可以将“friends”设置为数组,但我不想这样做。好了: db.collection.aggregate({ $a
{
"id":1,
"name":"A",
"lastName":"AA",
"friends":{
"f1":{"name":"X", "lastName":"XX"},
"f2":{"name":"Y", "lastName":"YY"}
}
}
我想搜索名为“Y”的朋友,但不知道钥匙是“f2”。。。钥匙可以是任何东西。我知道我可以将“friends”设置为数组,但我不想这样做。好了:
db.collection.aggregate({
$addFields: {
"friends": {
$arrayToObject: { // transform the array of key-value pairs back into a subdocument
$filter: {
input: {
$objectToArray: "$friends" // transform the "friends" subdocument into an array of key-value pairs
},
as: "this",
cond: {
$eq: [ "$$this.v.name", "Y" ] // we only want the ones where the name is "Y"
}
}
}
}
}
})
没有f1或f2是不可能的项目非常复杂。。。“$$this.v.name”中的“v”在做什么?它实际上并不复杂,是解决类似您的案例的默认(也是唯一)方法。使用聚合框架,您始终可以从末尾开始一个接一个地减少阶段,以查看发生了什么。所以只要去掉第二个阶段,你就会看到发生了什么。此外,我将简化以上内容,因为我认为它可以在一个阶段中编写。看来您了解mongodb。在JSON中使用JSON代替数组是一个坏的方法吗?当然,我认为您应该考虑更改文档结构。在这种布局中处理数据很痛苦。也在客户端。表示文档列表的内容通常也应存储为列表(=数组)。