使用$ lookup进行Mongo数据库聚合

时间:2017-03-02 11:17:18

标签: mongodb aggregation-framework

我正在尝试为我正在创建的页面构建一个有用的报告,但是我在格式化数据时遇到了问题,请看下面的内容:

db.getCollection('store_spendings').aggregate(
{
  "$project": { "spend_dollars": 1, "comments.text": 1, "comments.user.user_id": 1, "store_id": 1 }
},
{
  "$lookup":
     {
        "from": "corporate_spendings",
        "localField": "store_id",
        "foreignField": "store_id",
        "as": "corporate_spendings"
    }
},
{
  "$match": { "corporate_spendings.region_id": 10816 }  
},
{
  "$project": { "spend_dollars": "$spend_dollars", "comments": 1, "prior_year_spend_dollars": "$corporate_spendings.prior_year_spend_dollars" } }
)

我得到这样的结果:

[
  spend_dollars: 321312,
  comments: [...comments data],
  prior_year_spend_dollars: [1231231],
  ...
]

我得到了正确的结果,除了prior_year_spend_dollars的数据格式有点偏。我希望它是一个像spend_dollars而不是数组的字段。

我尝试过使用$first,但显然它只适用于群组。现在我在我的应用程序中执行此“第一次”操作,但理想情况下,它将在数据库上完成。

我的理想输出是这样的:

[
  spend_dollars: 321312,
  comments: [...comments data],
  prior_year_spend_dollars: 1231231,
  ...
]

我该怎么做?

1 个答案:

答案 0 :(得分:1)

arrayElemAt阶段尝试project运算符,它允许您根据索引从数组中选择值。

 "prior_year_spend_dollars": 
{"$arrayElemAt": ["$corporate_spendings.
prior_year_spend_dollars", 0]}