Mongo $ filter(聚合)只获得一个数组元素

时间:2017-12-13 02:16:41

标签: mongodb

我使用mongodb进行了一些过滤,但它返回了我的数组中的所有数据。但我只想从该数组中获取特定元素。我无法在文件中找到它。

db.sales.aggregate([
       {
          $project: {
             items: {
                $filter: {
                   input: "$items",
                   as: "item",
                   cond: { $gte: [ "$$item.price", 100 ] }
                }
             }
          }
       }
    ])

运行以上命令我将这是结果

{
   "_id" : 0,
   "items" : [
      { "item_id" : 2, "quantity" : 1, "price" : 240 }
   ]
}

问题是我只想得到价格

  {
       "_id" : 0,
       "items" : [
          { "price" : 240 }
       ]
    }

甚至

{
    "price" : 240 
}

怎么做?

2 个答案:

答案 0 :(得分:0)

如果您的数据看起来像这样,我不知道您的整个数据是什么

{
    "_id" : 0,
    "items" : [
        {
            "item_id" : 1,
            "quantity" : 5,
            "price" : 80
        },
        {
            "item_id" : 2,
            "quantity" : 1,
            "price" : 240
        },
        {
            "item_id" : 3,
            "quantity" : 4,
            "price" : 320
        }
    ]
}

试试这个

> db.sales.aggregate([
    {'$unwind': '$items'},
    {'$project': {'price': '$items.price'}},
    {'$match' : {'price': {'$gte': 100 }}}
])
{ "_id" : 0, "price" : 240 }
{ "_id" : 0, "price" : 320 }

$unwind

{'items': [{'item_id': 1}, {'item_id': 2}]} 
$unwind

之后

{'items': {'item_id': 1}}
{'items': {'item_id': 2}} 

$project

这可以选择您想要的字段(或者只删除您不想要的字段),并将字段重命名为您想要的字段。

{'items': {'item_id': 1}}
$project

之后

{'renamefor__item_id': 1}

$match

请参阅上一个链接了解更多详情。我的英语不是很好:(

答案 1 :(得分:0)

你实际上需要$map来改变"返回的数组元素,仅$filter"选择" "匹配"的数组元素。尝试运行以下代码。

ds.sales.aggregate([
    {
        $project: {
            items: {
                $map: {
                    input: {
                        $filter: {
                            input: "$items",
                            as: "item",
                            cond: { $gte: [ "$$item.price", 100 ] }
                         }
                    },
                    "as": "a",
                    "in": {
                        "price": "$$a.price"
                      }
                }
            }
        }
    }], function (err, list) {
    ...