猫鼬$ in [ObjectIds]返回0条记录

时间:2019-11-25 21:54:52

标签: mongodb mongoose objectid

在猫鼬模型中,我们有一个产品引用了一篇文章。

这是模式的一部分:

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中,则确实可以得到所需的结果。

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

1 个答案:

答案 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..