如果我有类似于以下的架构:
{
"_id" : "12345",
"_class" : "Refrigerator",
"items" : {
"APPLE" : {
"id" : 123,
"name" : "APPLE"
},
"BANANA" : {
"id" : 234,
"name" : "BANANA"
},
"STRAWBERRY" : {
"id" : 345,
"name" : "STRAWBERRY"
}
},
},
{
"_id" : "23456",
"_class" : "Pantry",
"items" : {
"CEREAL" : {
"id" : 456,
"name" : "CEREAL"
}
},
}
我想获得_class = Refrigerator的不同项目列表。结果应为["APPLE","BANANA","STRAWBERRY"]
。
我怎样才能做到这一点?谢谢!
答案 0 :(得分:1)
您可以使用聚合运算符$objectToArray
(SERVER-23310)将键转换为值。它应该能够将未知的'或者'动态'领域。 MongoDB v3.4.4 +
根据您的示例文档,您可以在aggregation pipeline
下方使用db.collection.aggregate([
{$match:{"class":"Refrigerator"}},
{$project:{"items":{$objectToArray:"$items"}}},
{$unwind:"$items"},
{$group:{_id:"$_id", result:{$addToSet:"$items.k"}}}
])
另请参阅手册:$unwind,$group和$addToSet
如果适用于您的使用案例,我建议您重新考虑data schema,以便更轻松地访问您之后的信息。 MongoDB具有灵活的架构,您应该将其用于应用程序的好处。