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

Mongoose .find 带有 req.params 数组?和 res.json 每个值和计数的数组?

Mongoose 查询返回带有空数组的嵌套文档