从另一个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代替数组是一个坏的方法吗?当然,我认为您应该考虑更改文档结构。在这种布局中处理数据很痛苦。也在客户端。表示文档列表的内容通常也应存储为列表(=数组)。