猫鼬 $在 [ObjectIds] returns 0 条记录
Mongoose $in [ObjectIds] returns 0 records
在我们的 Mongoose 模型中,我们有一个产品引用了一篇文章。
这是架构的一部分:
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 })
This returns 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: Cast to ObjectId failed for value "\"{$oid: \"5dcd2a95d7e2999332441825\"}\"".
虽然 - 如果我采用那个特定的控制台记录过滤器并将其作为过滤器传递到 Studio 3T,我确实得到了想要的结果。
知道我在这种情况下做错了什么吗?
操我!我只是个大白痴.. 显然在 find()
方法之后添加了一个 .skip(10)
-.-'.... 现在我明白为什么返回 0 条记录了......在这上面花了几个小时..
为了将来参考,如果在模式中定义,Mongoose 会自动将字符串转换为 ObjectId。因此,如果您没有 skip
前 10 条记录:
const articles = ["5dcd2a95d7e2999332441825",
"5dcd2a95d7e2999332441827",
"5dcd2a96d7e2999332441829"]
filter.article_id = {
$in: articles
};
return Product.find({ ...filter }) // Note that I DON'T put .skip() here..
在我们的 Mongoose 模型中,我们有一个产品引用了一篇文章。
这是架构的一部分:
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 })
This returns 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: Cast to ObjectId failed for value "\"{$oid: \"5dcd2a95d7e2999332441825\"}\"".
虽然 - 如果我采用那个特定的控制台记录过滤器并将其作为过滤器传递到 Studio 3T,我确实得到了想要的结果。
知道我在这种情况下做错了什么吗?
操我!我只是个大白痴.. 显然在 find()
方法之后添加了一个 .skip(10)
-.-'.... 现在我明白为什么返回 0 条记录了......在这上面花了几个小时..
为了将来参考,如果在模式中定义,Mongoose 会自动将字符串转换为 ObjectId。因此,如果您没有 skip
前 10 条记录:
const articles = ["5dcd2a95d7e2999332441825",
"5dcd2a95d7e2999332441827",
"5dcd2a96d7e2999332441829"]
filter.article_id = {
$in: articles
};
return Product.find({ ...filter }) // Note that I DON'T put .skip() here..