如何从mongo中的数组中仅检索查询的对象?

时间:2019-05-13 19:16:03

标签: mongodb mongodb-query

我的文档具有以下结构:

{
    "sku": "x",
    "prices": [{"code": 1}, {"code": 2}, {"code": 3}]
}

我正在尝试仅查询价格数组中具有代码1或3的对象。

db.my_coll.find({
    sku: "x"
}, {
    _id: 0,
    prices: {
        $elemMatch: {
            $or: [{code: 1}, {code: 3}]
        }
    }
})

但是结果只检索code 1:

{ "prices" : [ {"code" : 1} ] }

结果应为:

{ "prices" : [ {"code" : 1}, {"code": 3} ] }

我怎样才能只获得数组中的特定对象?

  

价格数组包含很多对象(至少100个)

2 个答案:

答案 0 :(得分:0)

$elemMatch仅返回第一个匹配的元素,您可以将$filter$match一起使用:

db.my_coll.aggregate([
    {
        $match: { sku: "x" }
    },
    {           
        $project: {
            _id: 0,
            prices: {
                $filter: {
                    input: "$prices",
                    cond: {
                        $in: [ "$$this.code", [ 1, 3 ] ]
                    }
                }
            }
        }
    },
    {
        $match: {
            prices: { $ne: [] } // if you don't want to get empty arrays in result set
        }
    }
])

答案 1 :(得分:0)

另一种更老套的方法,并且如果您没有App.messages = App.cable.subscriptions.create { channel: "MessagesChannel", id: <%= params[:id] %> }, connected: -> # ... # ... 版本(由于引入了$filter,则通过$ unwind / $ match / $ group和$ project:

MongoDB 3.2

您可以在此处查看结果:https://mongoplayground.net/p/JQ4xRomk3VM

db.my_coll.aggregate([ { $unwind: "$prices" }, { $match: { sku: "x", "prices.code": { $in: [ 1, 3 ] } } }, { $group: { _id: "$_id", prices: { $push: "$prices" } } }, { $project: { _id: 0, prices: 1 } } ]) 的总体方法似乎是您在mickl及更高级别上想要的。