通过嵌套的对象数组

时间:2015-06-30 22:34:38

标签: arrays mongodb mongodb-query

首先,请允许我说这个问题与我在mongo中看到的有关嵌套数组的其他问题略有不同。

他们中的大多数人都会问如何在嵌套数组中获取特定元素。我想得到一个数组的所有元素,它自己有另一个包含给定值的数组。

我有文件,看起来像这样:

{
    _id: something,
    value: something,
    items: [{ 
        name: someItem,
        price: somePrice,
        stores:[
            {name: storeName, url: someUrl },
            {name: anotherStoreName, url: someOtherUrl}
        ]
    },
    {
        name: someOtherItem,
        price: someOtherPrice,
        stores:[
            {name: storeName, url: someUrl },
            {name: yetAnotherStoreName, url: someOtherUrl}
        ]
    }]
}

我想要的是只获取在stores数组中具有给定商店的items元素。 这是,如果我问storeName,我应该在示例中获得这两个项目。但是如果我要求anotherStoreName,我应该只获得数组项的第一个元素。

搜索类似问题并尝试解决方案我只能获得项目的第一个匹配元素,但我想要所有匹配元素。

我很感激任何帮助。

2 个答案:

答案 0 :(得分:1)

您应该使用mongo aggregation以下列方式获得结果。

首先使用$unwind分隔items数组,然后添加匹配条件。

db.collection.aggregate([{
    $unwind: "$items"
}, {
    $match: {
    "items.stores.name": "storeName"
    }
}, {
    $project: {
    _id: 0,
    items: "$items"  //you can add multiple fields here
    }
}]); 

答案 1 :(得分:0)

您应该使用聚合框架来展开items数组上的元素,然后将它们视为单独的文档。

db.data.aggregate([
    {
        $unwind: "$items"
    },
    {
        $project: {
            _id: 0,
            items: "$items"
        }
    },
    {
        $match: {
            "items.stores.name": "yetAnotherStoreName"
        }
    }
]);
  • $ project只是让你使用文档的重要部分。
  • 使用你的驱动程序时,请小心使用mongoshell。

结果。

Result image