如何只将选定的字段放入mongo数组

时间:2018-03-19 13:10:37

标签: mongodb aggregation-framework

有一个代理商表 - 每个代理商可以拥有多个用户 我想要users []数组但只有有限的字段

这个可行,但它将太多的信息放入users []数组......

    agencyTable.aggregate([
            {
                $match: {}
            },
            {
                $sort: {
                    activityDate: 1
                }
            },              
            {
                $lookup: {
                    from: "users",
                    localField: "_id",
                    foreignField: "agency", 
                    as: "users"     
                }   
            },
            { $unwind: "$users" },
            { $match: { 'users.type': 'agent' } }, 
            {
                $group: {
                    "_id": "$_id",
                    "phone": { "$first": "$phone" },
                    "activityDate": { "$first": "$activityDate" },
                    "users": { "$push": "$users" }
                }
            },  
            {
                $project: {
                    "_id" : 1,
                    "phone" : 1,
                    "activityDate" : 1,
                    "users" : 1
                    // "userID" : "$users._id",
                    // "userName" : "$users.name",
                    // "userPhone" : "$users.phone",
                }
            }]

然后我尝试取消注释下面的3行,但后来发生了一些奇怪的事情......

vm.agencyRecord : [
    {
        "_id": "Mic Agency Ltd",
        "phone": "ZZZZ",
        "activityDate": 1521460192,
        "userID": [
            "michael@micagency.com",
            "nana@micagency.com",
            "gogo@micagency.com",
            "wollahsom@micagency.com",
            "sdfsdf@werwerwer.ccc",
            "werwer@ertert.dd"
        ],
        "userName": [
            "Michael Agent",
            "Nana Banana",
            "Gogo Banana",
            "Wollah Woldsom",
            "weqweqweqwe",
            "werwer"
        ],
        "userPhone": [
            "99 22 99 22 33",
            "111 222 999",
            "111 222 999",
            "234234234",
            "34234234234",
            "werwerwer"
        ]
    },

原因那不是我想要的。我希望保留相同的用户阵列,只需要少得多的字段。

这可能吗?

1 个答案:

答案 0 :(得分:2)

使用$map限制字段。

$$语法,用于访问usr用户变量以引用元素,后跟您希望保留的字段映射。

这样的东西
{
  "$project":{
    "_id":1,
    "phone":1,
    "activityDate":1,
    "users":{
      "$map":{
        "input":"$users",
        "as":"usr",
        "in":{
          "userID":"$$usr._id",
          "userName":"$$usr.name",
          "userPhone":"$$usr.phone"
        }
      }
    }
  }
}

您可以使用$addFields阶段而不是$project阶段来简化汇总。

{
   "$addFields":{
      "users":{
        "$map":{
           "input":"$users",
           "as":"usr",
           "in":{
              "userID":"$$usr._id",
              "userName":"$$usr.name",
              "userPhone":"$$usr.phone"
            }
         }
      }
   }
}