在我们的猫鼬模型中,我们有一个产品引用了一篇文章。
这是架构的一部分:
const product = new Schema({
article_id: Schema.Types.ObjectId,
title: String,
description: String,
...
在API中,我们正在寻找引用特定文章列表的产品,而我想使用$ in运算符:
const articles = ["5dcd2a95d7e2999332441825",
"5dcd2a95d7e2999332441827",
"5dcd2a96d7e2999332441829"]
filter.article_id = {
$in: articles.map(
article => new mongoose.Types.ObjectId(article)
),
};
return Product.find({ ...filter })
这将返回0条记录,但是我确定它应该至少返回3条记录。查看控制台日志,所发生的就是在ObjectId
转换期间从数组中删除了双引号。
然后,我通过为每个映射数组项返回{$oid: "id goes here"}
,尝试了一种不同的方法:
const articles = ["5dcd2a95d7e2999332441825",
"5dcd2a95d7e2999332441827",
"5dcd2a96d7e2999332441829"]
filter.article_id = {
$in: articles.map(
article => ({$oid: article})
),
};
return Product.find({ ...filter })
这给出了一个不同的数组:
console.log(filter);
// {article_id: {$in: [{$oid: "5dcd2a95d7e2999332441825"}, {$oid: "5dcd2a95d7e2999332441827"}, {$oid: "5dcd2a96d7e2999332441829"}]}}
但是在这种情况下,我得到以下错误:
CastError:对值“ \” {$ oid:\“ 5dcd2a95d7e2999332441825 \”} \“”的对象ID转换失败。
尽管-如果我使用该特定的控制台记录的过滤器,并将其作为过滤器传递到Studio 3T中,则确实可以获得所需的结果。
知道在这种情况下我做错了什么吗?
操我!我只是个大笨蛋。.显然在.skip(10)
方法之后添加了find()
-.-'....现在,我明白为什么0记录返回了...在此花费了数小时..