猫鼬 $在 [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..