如何在正在分组的mongodb中查找聚合集合?

时间:2018-12-27 10:25:27

标签: mongodb mongodb-query aggregation-framework

由于某种原因,我无法从聚合查询的另一个集合中检索作者姓名。

db.getCollection('books').aggregate([
{
  $match: {
  authorId: { $nin: [ObjectId('5b9a008575c50f1e6b02b27b'), ObjectId('5ba0fb3275c50f1e6b02b2f5'), ObjectId('5bc058b6ae9a2a4d6df330b1')]},
  isBorrowed: { $in: [null, false] },
  status: 'ACTIVE',
},
},
{
    $lookup: {
     from: "authors",
     localField: "authorId", // key of author id in "books" collection
     foreignField: "_id", // key of author id in "authors" collection
     as: "bookAuthor",   
    }
},
{
  $group: {
    _id: {
        author: '$authorId',    
    },
    totalSalePrice: {
      $sum: '$sale.amount',
    },
  },
},
{
  $project: {
      author: '$_id.author',
      totalSalePrice: '$totalSalePrice',    
      authorName: '$bookAuthor.name', // I can't make this appear  
      _id: 0,
  },
},
{ $sort: { totalSalePrice: -1 } },

])

关于我错了哪里的任何建议?感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

实际上,您在$group阶段丢失了bookAuthor字段。您必须使用$first累加器才能在下一个$project阶段使用它。

{ "$group": {
  "_id": { "author": "$authorId" },
  "totalSalePrice": { "$sum": "$sale.amount" },
  "authorName": { "$first": "$bookAuthor" }
}},
{ "$project": {
  "author": "$_id.author",
  "totalSalePrice": "$totalSalePrice",    
  "authorName": { "$arrayElemAt": ["$bookAuthor.name", 0] }
  "_id": 0,
}}

答案 1 :(得分:1)

这里缺少两件事:您需要$unwindbookAuthor从数组转换为单个对象,然后需要将该对象添加到$group阶段(以便它将在下一阶段提供),请尝试:

db.getCollection('books').aggregate([
    {
    $match: {
        authorId: { $nin: [ObjectId('5b9a008575c50f1e6b02b27b'), ObjectId('5ba0fb3275c50f1e6b02b2f5'), ObjectId('5bc058b6ae9a2a4d6df330b1')]},
        isBorrowed: { $in: [null, false] },
        status: 'ACTIVE',
        },
    },
    {
        $lookup: {
            from: "authors",
            localField: "authorId", 
            foreignField: "_id", 
            as: "bookAuthor", // this will be an array   
        }
    },
    {
        $unwind: "$bookAuthor"
    },
    {
        $group: {
            _id: {
                author: '$authorId',    
            },
            bookAuthor: { $first: "$bookAuthor" },
            totalSalePrice: {
                $sum: '$sale.amount',
            },
        },
    },
    {
        $project: {
            author: '$_id.author',
            totalSalePrice: '$totalSalePrice',    
            authorName: '$bookAuthor.name',  
            _id: 0,
        },
    },
    { $sort: { totalSalePrice: -1 } },
])