MongoDB 聚合查询未正确过滤

MongoDB Aggregate Query Not Filtering Correctly

我环顾四周,看到很多类似的问题,但我不太明白为什么我的代码不起作用。我是 MongoDB 的新手,所以我可能使用不正确。我基本上只是尝试 select 一个随机文档,但过滤掉通过数组传递的文档。在请求正文中,我们将此发布到服务器:

{
    "chosen_lists": ["62718d522a2b7790b4052331"]
}

我有这样的代码来尝试过滤和 return 任何一个没有该 ID 的随机文档,如下所示:

const chosenLists = req.body.chosen_lists; 

list = await List.aggregate([
  { $match: { _id: { '$nin': chosenLists } }},
  { $sample: { size: 1 } }
], (err, docs) => docs);

不幸的是,服务器 return 只是随机 select 编辑了一份文档,并未将其过滤掉。我还在 _id 周围添加了引号,但这似乎也不起作用。提前感谢您的帮助!

编辑:我目前将 chose_lists 的 ID 作为字符串传递,而不是 ObjectId。我只是尝试抓住第一个并将其转换为 ObjectId,但也没有用:

list = await List.aggregate([
  { $match: {  _id: mongoose.Types.ObjectId(req.body.chosen_lists[0]) } },
  { $sample: { size: 1 } }
], (err, docs) => docs);

如果您的 _id 属性 是 ObjectId 您应该将其解析为字符串,如下所示:

const List = await List.aggregate([
      {
        $project: {
          _id: {
            $toString: "$_id"
          }
        }
      },
      { $match: { _id: { '$nin': chosenLists } }},
      { $sample: { size: 1 } }
    ]);

注意:字段名_id被保留用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是除默认数组以外的任何类型 mongo 将其用作 ObjectId.