mongoose - 如何使用带有请求参数数组的 $in 进行 .find()现在它只返回空数组
Posted
技术标签:
【中文标题】mongoose - 如何使用带有请求参数数组的 $in 进行 .find()现在它只返回空数组【英文标题】:mongoose - how to .find() using $in with request params array | for now it's only return empty array 【发布时间】:2021-10-09 03:40:38 【问题描述】:我想为标签做一个参数,它可以包含多个标签,所以它必须是一个数组。
已解决
我用我的控制台检查,如果只有 1 个标签,标签只返回 tag1
。但如果标签超过 1 个,则标签返回 ['tag1','tag2']
。 example tags
问题如何在数组中使用$in .find()
我现在的代码是
async function index(req, res, next)
try
let limit = 10, skip = 0, q = '', category = '', tags = [] = req.query;
let criteria = ;
...
if (tags.length)
tags = Array.isArray(tags) ? tags : tags.split();
console.log(tags)
tags = await Tag.find( name: $in: tags );
criteria = ...criteria, tags: $in: tags.map(tag => tag._id)
...
产品模型架构
const productSchema = Schema(
...
// One-To-Many
tags: [ type: Schema.Types.ObjectId, ref: 'Tag' ]
, timestamps: true );
module.exports = model('Product', productSchema);
标记模型架构
const tagSchema = Schema(
name:
type: String,
minlength: [3, 'Min length is 3 character!'],
maxlength: [20, 'Max length is 20 character!'],
required: [true, 'Tag name must be filled!']
);
module.exports = model('Tag', tagSchema)
问题是控制台返回空数组,我不知道出了什么问题。任何想法? example empty array
Success return example
【问题讨论】:
我看到你可能会直接使用带有 stingified 标签 Id 的 find 函数,你可能需要使用 mongoose.Types.ObjectId() 或其他东西在找到之前将其转换为 mongoId 看看这个***.com/a/8393613/8494319 @yashkothari 这是我关于错误的第一个。但是当我在标签参数中使用 ObjectId 时它仍然返回空数组 【参考方案1】:我找到了解决方案。这只是在 mongo 查询中区分大小写 Check the docs here.
区分大小写的多个标签的代码
if (tags.length)
// Split the array
tags = Array.isArray(tags) ? tags : tags.split();
console.log(tags)
// Case sensitive
var optValues = tags;
var optRegexp = [];
optValues.forEach(function (opt)
optRegexp.push(new RegExp(opt, 'i'));
);
console.log(optRegexp)
tags = await Tag.find( name: $in: optRegexp );
console.log("tags found" + tags)
criteria = ...criteria, tags: $in: tags.map(tag => tag._id)
感谢所有帮助我的人,我很感激。
【讨论】:
【参考方案2】:试试这个..
如果您在 Postman 中使用单个标签传递参数,那么它将为您提供字符串值。多个标签将给出数组。在这种情况下,如下所示
let limit = 10, skip = 0, q = '', category = '', tags = [] = req.query;
tags = Array.isArray(tags) ? tags : tags.split();
console.log(tags)
tags = await Tag.find( "tags.name": $in: tags );
根据您的文档,标签数组具有对象。因此,匹配查询将是 "tags.name" : $in:tags
tags = await Tag.find( "tags.name": $in: tags );
【讨论】:
此代码对于将单个标签制作成数组很有用,谢谢。但问题是如何使用 .find() 和 $in 使用数组,因为它返回空数组 check。我会更新我的问题@selva-mary 它仍然返回空数组。在tags = await Tag.find...
之后用控制台检查,控制台为空,表示.find()
没有正确返回
答案已更新为mongoplayground
您分享的是字符串"tags.name": "tag1"
,而不是数组"tags.name": [ "tag1" ]
。如果您尝试使用数组,您将看到找不到文档
nvm 我忘记包含 $in。 mongodb 中的查询应该是"tags.name": $in: ["tag1", "tag2" ]
。但它仍然在我的代码 omg 中返回空数组。以上是关于mongoose - 如何使用带有请求参数数组的 $in 进行 .find()现在它只返回空数组的主要内容,如果未能解决你的问题,请参考以下文章
如何创建 Mongoose Schema 并将默认设置为带有 typescript 的数组?
如何使用带有 Mongoose 的 addToSet 添加多个 ObjectId?
如何在不选择模式配置参数的情况下使用 mongoose 在 MongoDB 模式实例化中的关联数组/对象中执行 foreach?
节点使用带有 .catch() 语句的 Promise.all 为 Mongoose 请求抛出 UnhandledPromiseRejectionWarning