mongodb - 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,我确实得到了想要的结果。
知道在这种情况下我做错了什么吗?
解决方案
撩我!我只是一个大白痴..显然.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..
推荐阅读
- linux - Linux Qt 安装程序框架。如何创建具有依赖项的安装程序?
- pyspark - 无法在 jupyter Notebook 上初始化 SparkSession
- python - 优化python数据框迭代循环
- java - 在特定位置添加 XML 元素 JAVA
- text-mining - 是否可以用不平衡的数据训练分类模型?(文本分类-反向翻译)
- java - Maven 下载一个使用比选择更新的 java 版本构建的依赖项
- jenkins - 容器在使用詹金斯时对 pod 无效
- r - R - 将数据框中的值插入另一个数据框的行中,列名称为 ID
- flutter - 什么对应于 SwiftUI 中的 ForEach 块?
- docker - 如何通过 docker 在自己的电脑上安装 AzerothCore 服务器?