【问题标题】:mognoose searching with regular expression in multiple columns猫鼬在多列中使用正则表达式搜索
【发布时间】:2026-01-25 02:35:01
【问题描述】:

我有一个 mongoose 模型,其架构定义为 -

var campusNotesSchema = mongoose.Schema({
    noteId:{type:String, unique:true, default: uuid.v4()},
    title: {type:String, required:'{PATH} is required!'},
    uploader:{type:String,required:'{PATH} is required!'},
    department:{type:String},
    college:{type:String},
    author:{type:String,required:'{PATH} is required!'},
    actualFileName: [String],
    storedFileName: [String],
    subject: {type:String},
    description: {type:String},
    details: {type:String},
    date: {type:Date, default: Date},
    tags: [String]
});

而模型定义为 -

var Campusnotes = mongoose.model('Campusnotes', campusNotesSchema);

现在我想从请求对象参数中搜索标题、标签、描述字段,例如

if(req.query.searchText){        
    Campusnotes.find({title:new RegExp(searchText,'i'),description:new RegExp(searchText,'i')}).exec(function(err, collection) {
        res.send(collection);
    })
}

现在我如何确保在标题或描述中找到该术语的任何结果也包括在内,而不仅仅是在它们两者中都存在的结果。 另外,我如何在标签数组中搜索匹配的字符串

【问题讨论】:

    标签: regex node.js mongoose


    【解决方案1】:

    您可以在 mongoose 中使用 $or 运算符返回匹配结果
    $or http://docs.mongodb.org/manual/reference/operator/query/or/

    Campusnotes.find({'$or':[{title:new RegExp(searchText,'i')},{description:new RegExp(searchText,'i')}]}).exec(function(err, collection) {
        res.send(collection);
    })
    

    要在数组中搜索匹配的字符串,需要使用 mongo 的 $in 运算符:

    $inhttp://docs.mongodb.org/manual/reference/operator/query/in/

    【讨论】:

    • 根据手册,我需要我想要查看的数组,但我没有数据库中的标签数组。那么我如何进行查询以搜索存储在数据库中的数组中的某些文本
    • $in 运算符的工作方式如下:{ field: { $in: [<value1>, <value2>, ... <valueN> ] } } 其中,字段是存储在数据库中的文档的实体。手册明确指出,如果 field 是一个 array,则 $in 运算符选择其字段包含一个数组的文档,该数组包含至少一个与指定数组中的值匹配的元素 (例如 等)。对于您的用例,字段是 tags 数组,右侧数组仅包含一个值,即您要搜索的字符串。
    【解决方案2】:

    使用这个查询,$option = i,将跳过小写/大写 当您将数据插入 TAG 数组时,首先将其设为小写并使用小写进行搜索,这很容易。

    Campusnotes.find({title:{'$regex':searchText,'$option':'i'},description:{'$regex':searchText,'$option':'i'},tags:searchText}, function(err, collection){
    res.send(collection);
    });
    

    【讨论】:

      最近更新 更多