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
.
我环顾四周,看到很多类似的问题,但我不太明白为什么我的代码不起作用。我是 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
.