在猫鼬模型中,我们有一个产品引用了一篇文章。
这是模式的一部分:
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 \”} \“”强制转换为ObjectId。
但是-如果我使用该特定的控制台记录的过滤器,并将其作为过滤器传递到Studio 3T中,则确实可以得到所需的结果。
你知道在这种情况下我做错了什么吗?
答案 0 :(得分:0)
欺骗我!我只是个白痴。显然在.skip(10)
方法之后添加了find()
-.-'....现在我明白为什么0记录返回了...花了几个小时..
对于将来的引用,如果在Schema中定义,Mongoose会自动将字符串转换为ObjectIds。因此,以下操作完全可以正常工作,因为您无需skip
头10条记录:
const articles = ["5dcd2a95d7e2999332441825",
"5dcd2a95d7e2999332441827",
"5dcd2a96d7e2999332441829"]
filter.article_id = {
$in: articles
};
return Product.find({ ...filter }) // Note that I DON'T put .skip() here..