MongoDB v4的聚合查找查询中的投影

MongoDB v4的聚合查找查询中的投影,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在使用MongoDB v4,我有两个集合:user和stadiums 用户: 体育场馆: { "_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"), "name" : "Ipsum" } 当我运行此代码时: db.users.aggregate([ {$match: {name: 'Lorem'}}, { $lookup: { from: "stadiums", l

我正在使用MongoDB v4,我有两个集合:
user
stadiums

用户:

体育场馆:

{
    "_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
    "name" : "Ipsum"
}
当我运行此代码时:

db.users.aggregate([
    {$match: {name: 'Lorem'}},
   {
     $lookup:
       {
         from: "stadiums",
         localField: "stadiums.stadium",
         foreignField: "_id",
         as: "result"
       }
  }
])
我收到这个:

{
    "_id" : ObjectId("5e8a2ff9672f9f4327bbf4d6"),
    "name" : "Lorem",
    "stadiums" : [
        {
            "stadium" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
            "visited" : 0
        }
    ],
    "result" : [
        {
            "_id" : ObjectId("5e8a2af7672f9f4327bbf4d2"),
            "name" : "Ipsum"
        }
    ]
}

我想将已访问的属性放入结果数组中。是否可行?

您可以尝试以下聚合查询:

db.users.aggregate([
  { $match: { name: "Lorem" } },
  { $unwind: "$stadiums" }, // Unwind stadiums array to object
  {
    $lookup: {
      from: "stadiums",
      let: { visited: "$stadiums.visited", stadium: "$stadiums.stadium" }, // Create local variables
      pipeline: [
        { $match: { $expr: { $eq: ["$_id", "$$stadium"] } } },
        { $addFields: { visited: "$$visited" } }, // Add 'visited' value to matched Stadium doc & return 'stadium'
      ],
      as: "stadiums",
    },
  },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      stadiums: { $push: { $arrayElemAt: ["$stadiums", 0] } }, /** Pick first object from 'stadiums' array(o/p of lookup) & push to stadiums */
    },
  },
]);

测试:

您可以尝试以下聚合查询:

db.users.aggregate([
  { $match: { name: "Lorem" } },
  { $unwind: "$stadiums" }, // Unwind stadiums array to object
  {
    $lookup: {
      from: "stadiums",
      let: { visited: "$stadiums.visited", stadium: "$stadiums.stadium" }, // Create local variables
      pipeline: [
        { $match: { $expr: { $eq: ["$_id", "$$stadium"] } } },
        { $addFields: { visited: "$$visited" } }, // Add 'visited' value to matched Stadium doc & return 'stadium'
      ],
      as: "stadiums",
    },
  },
  {
    $group: {
      _id: "$_id",
      name: { $first: "$name" },
      stadiums: { $push: { $arrayElemAt: ["$stadiums", 0] } }, /** Pick first object from 'stadiums' array(o/p of lookup) & push to stadiums */
    },
  },
]);

测试:

以下聚合给出了预期结果-即,将相应的
已访问的
字段插入
结果
数组元素

db.users.aggregate( [
  {
      $match: { name: "Lorem" }
  },
  {
      $lookup: {
          from: "stadiums",
          localField: "stadiums.stadium",
          foreignField: "_id",
          as: "result"
      }
   },
  { 
      $addFields: { 
          result: {
              $map: {
                  input: "$result", as: "r",
                  in: {
                      $mergeObjects: [ 
                           "$$r",
                           { visited: { 
                                $reduce: { 
                                     input: "$stadiums", initialValue: 0,
                                     in: { 
                                         $cond: [ { $eq: [ "$$this.stadium", "$$r._id" ] },
                                                  { $sum : ["$$value", "$$this.visited"  ] }, 0
                                          ] 
                                     }
                                }
                           } }
                      ]
                  }
              }
          }
      }
  }
]).pretty()

下面的聚合给出了预期结果-即,将相应的
已访问
字段插入到
结果
数组元素中

db.users.aggregate( [
  {
      $match: { name: "Lorem" }
  },
  {
      $lookup: {
          from: "stadiums",
          localField: "stadiums.stadium",
          foreignField: "_id",
          as: "result"
      }
   },
  { 
      $addFields: { 
          result: {
              $map: {
                  input: "$result", as: "r",
                  in: {
                      $mergeObjects: [ 
                           "$$r",
                           { visited: { 
                                $reduce: { 
                                     input: "$stadiums", initialValue: 0,
                                     in: { 
                                         $cond: [ { $eq: [ "$$this.stadium", "$$r._id" ] },
                                                  { $sum : ["$$value", "$$this.visited"  ] }, 0
                                          ] 
                                     }
                                }
                           } }
                      ]
                  }
              }
          }
      }
  }
]).pretty()

是的,你可以。您想知道用户访问每个体育场的次数。看看聚合运算符的用法。是的,您可以。您想知道用户访问每个体育场的次数。看看聚合操作符的用法。哦,太好了,这正是我想要的。谢谢!哦,太好了,这正是我想要的。谢谢!谢谢你@prasad_!谢谢你@prasad_!