Mongodb - подсчет из под коллекции внутри совокупного поиска - PullRequest
0 голосов
/ 07 августа 2020

У меня есть следующий запрос mon go db, который работает:

.collection('commentsPosts')
.aggregate(
  [
   {$match:{
    commentedAt: {
      $lte: from,
    },
    ...(postId && { postId }),
    }
   },
   {$lookup:
      {
            from:"users",
            localField:"commentedBy",
            foreignField:"_id",
            as:"commenterDetails"
            // NEED TO LOOK UP "posts" collection here to find number of posts by commenterDetails.userId = posterId in posts table
      },
    }
  ]
)

Мне нужно go еще на один уровень вниз, чтобы ПРОСМОТРЕТЬ количество сообщений, чтобы найти количество сообщений, где commenterDetails. userId = posterId в коллекции сообщений

Я ищу способ добавить рабочий запрос ниже к запросу выше.

  const userPostCount = await req.db.collection('posts').countDocuments({
    creatorId: userId,
  });

1 Ответ

1 голос
/ 07 августа 2020

Вы можете использовать вложенные $ lookups следующим образом: https://mongoplayground.net/p/_il8aiilLh5

db.comments.aggregate([
  {$lookup:
    {
      from:"users",
      let: {userId: "$commentedBy"},
      as:"commenterDetails",
      pipeline: [
        {$match: {$expr: {
          $eq: ["$$userId", "$_id"], 
        }}},
        {$lookup: {
          from: "posts",
          as: "posts",
          let: {posterId: "$_id"},
          pipeline: [
            {$match: {$expr: {
              $eq: ["$posterId", "$$posterId"]
            }}},
            {$count: "total"},
          ]
        }},
        {$addFields: {
          posts: {$arrayElemAt: ['$posts', 0]}
        }},
      ]
    },
  },
  {$addFields: {
    commenterDetails: {$arrayElemAt: ['$commenterDetails', 0]}
  }}
])
...