当前位置: 首页 > 面试题库 >

如何使用猫鼬查找获取包含字符串一部分的所有值?

金兴朝
2023-03-14
问题内容

我在使用mongoose从MongoDB检索数据时遇到以下问题。

这是我的架构:

const BookSchema = new Schema(
    {
        _id:Number,
        title:String,
        authors:[String],
        subjects:[String]   
    }
);

如您所见,我在对象中嵌入了2个数组,比方说作者的内容可以是这样的:authors:[“ Alex Ferguson”,“ Didier Drogba”,“
Cristiano Ronaldo”,“ Alex”]
我是什么我试图实现的是将所有Alex都放在阵列中。

到目前为止,如果它们与值完全匹配,我已经可以得到它们。但是,如果我尝试获取包含Alex的答案,则答案始终为[]。

我想知道的是如何使用find()来执行此操作,而无需执行map-reduce来创建视图或集合,然后在其上应用find()。

此处的代码适用于完全匹配

Book.find( {authors:req.query.q} , function(errs, books){
            if(errs){
                res.send(errs); 
            }

            res.json(books);
        });

我尝试了一些方法,但是没有运气{authors:{$ elemMatch:req.query.q}} {authors:{$
in:[req.query.q]}}

这给了我一个错误,最重要的是,我在这里找到的另一篇文章效率很低。{$ where:this.authors.indexOf(req.query.q)!=
-1}

而且我还尝试了{作者:{$ regex:“ ./ value / i”}}

map-reduce工作正常,我需要使用另一种方法使其工作,以查看哪种方法更好?

任何帮助是极大的赞赏。我敢肯定这很容易,但是我是NodeJS和Mongo的新手,我自己还无法弄清楚。


问题答案:

您几乎自己在标签中回答了这个问题。MongoDB有一个
$regex

运算符,它允许将正则表达式作为查询提交。因此,您查询包含“ Alex”的html" target="_blank">字符串,您可以这样做:

Books.find(
    { "authors": { "$regex": "Alex", "$options": "i" } },
    function(err,docs) { 
    } 
);

您也可以这样做:

Books.find(
    { "authors": /Alex/i }, 
    function(err,docs) {

    }
);

两者都是有效的,并且与您以正确的受支持语法尝试的方式不同,如文档中所示。

但是,当然,如果您实际上是在问“如何仅对那些与字符串中的“ Alex”匹配的结果获取“数组”结果?” 那么这有点不同。

超过复杂的匹配 一个
数组元素是域聚合框架(或可能的MapReduce,但这是很慢),在需要“过滤器”的数组的内容。

您的开始大体相同。此处的关键是对
$unwind
数组内容进行“反规范化”,以便能够作为单独的文档正确地“过滤”。然后,使用“匹配”文档重新构建数组。

Books.aggregate(
    [
        // Match first to reduce documents to those where the array contains the match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Unwind to "de-normalize" the document per array element
        { "$unwind": "$authors" },

        // Now filter those document for the elements that match
        { "$match": {
            "authors": { "$regex": "Alex", "$options": i }
        }},

        // Group back as an array with only the matching elements
        { "$group": {
            "_id": "$_id",
            "title": { "$first": "$title" },
            "authors": { "$push": "$authors" },
            "subjects": { "$first": "$subjects" }
        }}
    ],
    function(err,results) {

    }
)


 类似资料:
  • 问题内容: 我一直在寻找一个命令,该命令将从当前目录返回文件名中包含字符串的文件。我已经看到和命令可以找到以某些内容开头或结尾的文件。 如何返回文件名中包含字符串的文件列表? 例如,if 是当前目录中的文件。 如何返回此文件和其他包含字符串的文件?使用诸如 问题答案: 用途: 它将在当前目录中找到所有包含“字符串”的文件(如果要递归,则删除),并将其打印在屏幕上。 如果要避免文件包含“:”,则可以

  • 问题内容: 说我有一个ArrayList: 我希望在我说arrayList.containsSubString(’string1’);时返回arrayList的第一个元素。除了遍历元素的每个元素并检查该元素字符串的子字符串之外,该如何做? 问题答案: 我能想到的唯一方法是执行以下操作: 虽然不知道这是否被认为是好的做法。

  • 当我使用opencsv读取csv文件时,它在字符串末尾遇到\时无法正常工作。它使字符串的"部分,而不是'\',因为我想。我想一定有什么方法可以添加另一个\,让它转义\字符?无需手动编辑csv文件。我找过了,但什么也没找到。 为了澄清我的问题,看起来是这样的: csv文件 我的代码看起来像这样(不是真的,但它显示了我的问题): 我想把它解析成一个String[],每行有4个元素,但是最后一行只解析成

  • 问题内容: 当我使用opencsv读取csv文件时,在字符串末尾遇到“ \”时,它无法正常工作。它使字符串的一部分成为“”,而不是我想要的“ \”。我猜必须使用某种方法来添加另一个“ \”以使其转义为“ \”字符吗?而 无需 手动编辑csv文件。我已搜索但未找到任何内容。 为了澄清我的问题,它看起来像这样: CSV文件 我的代码看起来像这样(不是真的,但是它显示了我的问题): 我希望将此解析为每行

  • 所以我想替换一个文本文件的一部分,只知道它看起来是这样的: 名称将从终端输入,方括号内将有数百行的值以及其他方括号。而且单词Part前面会有一个制表符,在第一个之后会有一个新的行{在最后一个之前也会有一个新的行和一个制表符。我该如何用另一个字符串替换括号内的部分,甚至全部。

  • 我使用的是android(SQL)中的Room database,我有一个表,它将日期作为一列存储为2000-01-31格式的字符串。我想获得表中的所有条目,根据它们各自的月份。我想用 但这样,我将不得不为每个月编写单独的查询。我想获得的条目按月,并显示在我的android应用程序。