如何仅在MongoDB

时间:2018-04-11 08:14:56

标签: mongodb mongodb-query

鉴于以下文件:

{ "id" : 1, "widgets" : [ { "name" : "foo", quantity: 1 }, { "name" : "bar", quantity: 3 } ] },
{ "id" : 2, "widgets" : [ { "name" : "baz", quantity: 2 } ] }

我想返回与 id 1 名称栏匹配的小部件子文档,但我只想返回该小部件,因此结果应该返回:

{ "name" : "bar", quantity: 3 }

我似乎无法找到一个投影来实现这种情况,而无需查看可能代价高昂的聚合运算符$filter

2 个答案:

答案 0 :(得分:0)

db.collection.aggregate(

    // Pipeline
    [
        // Stage 1
        {
            $match: {
                id: 1,
                widgets: {
                    $elemMatch: {
                        name: 'bar'
                    }
                }
            }
        },

        // Stage 3
        {
            $unwind: {
                path: "$widgets",
            }
        },

        // Stage 4
        {
            $match: {
                'widgets.name': 'bar'
            }
        },

        // Stage 5
        {
            $project: {
                widgets: 1
            }
        },

    ]



);

答案 1 :(得分:0)

好吧,如果你想玩aggregate那么很酷。这就是我做的方式。

db.products.aggregate([
     { $unwind : "$widgets"},
     { $match : {"id" : 1 , "widgets.name" : "bar"}},
     { $addFields: {name: "$widgets.name" ,quantity: "$widgets.quantity"}}, 
     { $project : {widgets : 0, _id : 0, id : 0}}

])

现在发生的事情是

  1. 展开收藏
  2. 使用过滤器
  3. 添加您要显示的字段
  4. 隐藏其他所有内容
  5. 几乎为您的查询提供服务

    由于