我在使用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应用程序。