如何查找mongodb中各种数组的"Author"字段?

How to make a lookup of the "Author" field of various arrays in mongodb?

我的问题是我想为对象数组 "Reviews"、"Followers" 和 "Watching" 查找字段 "Author",但我没有这样做知道为什么它在其他数组中给我这个结果,该值重复 "Reviews" 数组中文档的相同次数。

  .unwind({ path: '$reviews', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$reviews.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'reviews.author',
  })
  .unwind({ path: '$followers', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$followers.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'followers.author',
  })
  .unwind({ path: '$watching', preserveNullAndEmptyArrays: true })
  .lookup({
    from: 'users',
    let: { userId: '$watching.author' },
    pipeline: [
      { $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
      {
        $project: {
          name: 1,
          username: 1,
          photo: 1,
          rank: 1,
          'premium.status': 1,
          online: 1,
        },
      },
    ],
    as: 'watching.author',
  })
  .group({
    _id: '$_id',
    data: {
      $first: '$$ROOT',
    },
    reviews: {
      $push: '$reviews',
    },
    followers: {
      $push: '$followers',
    },
    watching: {
      $push: '$watching',
    },
  })

This is the result when "Reviews" has documents:

"Followers / Watching" 数组在数据库中没有任何内容,但它以这种方式显示在这里,重复该值与评论中的文档数量相同,我不知道会发生什么。

And when all arrays are empty, this happens:

一直显示,不知道怎么修复

综上所述,"Reviews"、"Watching" 和 "Followers" 有一个 "Author" 字段,我想查找 watching 的作者字段,并且也适用于关注者和评论,但我有这些问题。我需要帮助。

Example: This is how it looks in the database:

非常感谢您。

$unwind 阶段为要展开的数组中的每个元素创建一个新文档。每个新文档都将包含文档中所有其他字段的副本。

如果原始文档看起来像

{
  _id: "unique",
  Array1:["A","B","C"],
  Array2:["D","E","F"],
}

展开后"Array1",管道中将有3个文档:

[
 {
   _id: "unique",
   Array1:"A",
   Array2:["D","E","F"]
 },{
   _id: "unique",
   Array1:"B",
   Array2:["D","E","F"]
 },{
   _id: "unique",
   Array1:"C",
   Array2:["D","E","F"]
 }
]

然后展开 "watchers" 将展开 each 观察者数组,以便您获得数组的笛卡尔积。 Playground

在您的例子中,原始文档有 2 个评论,但没有关注者和观察者,因此在管道的开头包含一个文档,类似于:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: [{content:"review1", author:"ObjectId"},
              {content:"review2", author:"ObjectId"}]
  }
]

第一次展开后,您有 2 个文档:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review1", author:"ObjectId"}
  },
{
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review2", author:"ObjectId"}
  }
]

第一次查找将作者 ID 替换为每个文档的数据,然后第二次展开应用于每个文档。

由于该数组为空,因此查找 returns 一个空数组,并应用第三次展开。 在 $group 阶段之前,管道包含 2 个带有数组的文档:

[
  {
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review1", author:"ObjectId"},
    followers: {author: []},
    watchers: {author: []}
  },
{
    _id: "ObjectId",
    data: "other data"
    reviews: {content:"review2", author:"ObjectId"},
    followers: {author:[]},
    watchers: {author: []}
  }
]

由于两个文档具有相同的 _id,因此将它们组合在一起,最终结果包含第一个文档 "data"。

对于数组,当遇到每个文档时,相应字段的值被推送到数组中,导致每个数组有 2 个值。