MongoDB针对对象数组的不同查询

时间:2017-04-28 03:50:35

标签: mongodb mongodb-query aggregation-framework

如果我有类似于以下的架构:

{
    "_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"]。 我怎样才能做到这一点?谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用聚合运算符$objectToArraySERVER-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具有灵活的架构,您应该将其用于应用程序的好处。