Как выполнить поиск в агрегированной коллекции в mongodb, которая группируется? - PullRequest
0 голосов
/ 27 декабря 2018

По какой-то причине я не могу получить имя автора из другой коллекции по моему совокупному запросу.

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 голосов
/ 27 декабря 2018

Здесь отсутствуют две вещи: вам нужно $ unwind , чтобы преобразовать bookAuthor из массива в один объект, а затем вам нужно добавить этот объект на вашу $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 } },
])
0 голосов
/ 27 декабря 2018

На самом деле вы потеряли поле bookAuthor на этапе $group.Вы должны использовать аккумулятор $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,
}}
...