MongoDB聚合查询未正确筛选



我环顾四周,发现了很多类似的问题,但我不太明白为什么我的代码不起作用。我是MongoDB的新手,所以我可能使用了一些错误的东西。我基本上只是尝试选择一个随机文档,但过滤掉通过数组传递的文档。在请求正文中,我们向服务器发布了以下内容:

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

我有这样的代码来尝试过滤并返回任何一个没有该id的随机文档,比如:

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

不幸的是,服务器只返回一个随机选择的文档,而没有将其过滤掉。我还在_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是保留的,用作主键;它的值在集合中必须是唯一的,是不可变的,并且可以是数组以外的任何类型,因为默认情况下将其用作ObjectId

最新更新