首页 > 解决方案 > Mongoose $in [ObjectIds] 返回 0 条记录

问题描述

在我们的 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 })

这将返回 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,我确实得到了想要的结果。

知道在这种情况下我做错了什么吗?

标签: mongodbmongooseobjectid

解决方案


撩我!我只是一个大白痴..显然.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.. 

推荐阅读