我正在使用MongoDB搜索包含列表列表的元素,其中列表中至少有一个项目与搜索参数匹配。
这是我目前拥有的结构的一个例子。
{
"Item 1":{
"data":[
["green", 1]
]
},
"Item 2":{
"data":[
["blue", 9],
["green", 1]
]
}
}
我想搜索数据列表中值为“绿色”的所有项目。
我目前有这个:
my_data.find({'data': {'$in': ['green']}})
但是,不会返回任何结果。
您需要一个到任何查询元素的“直接路径”,“数据”不是您需要在此搜索的路径的“顶层”,而是文档中的“项目1”或“项目2”,“数据”是它的子元素。
基本情况是使用“点表示法”,其中根元素“已知”至少可能存在,并且还要注意$in
运算符不仅仅是为了匹配数组中的值,因为MongoDB不在乎。但是您需要一个嵌套的$elemMatch
:
db.my_data.find({
"$or": [
{ "Item 1.data": {
"$elemMatch": {
"$elemMatch": { "$eq": "green" }
}
}},
{ "Item 2.data": {
"$elemMatch": {
"$elemMatch": { "$eq": "green" }
}
}}
]
})
没有“通配符”来匹配前面路径的一部分,因此有必要在< code>$or条件中声明完整路径,以便在文档中搜索每个可能的路径。
如果写出所有可能的前缀键不切实际,那么您唯一的其他方法是使用JavaScript评估和$在哪里
来确定匹配的逻辑:
db.my_data.find(function() {
var doc = this;
delete doc._id;
var matched = false;
for ( k in doc ) {
matched = doc[k].data.some(function(el) {
return el.some(function(inner) {
return inner === "green";
});
});
if (matched) break;
}
return matched;
})
或者是该逻辑的某种变体,用“数据”数组来实际测试可能的元素,以包含您的“绿色”值。这不是一个很好的解决方案,因为< code>$where需要在每个文档上执行以评估条件,因此不能使用索引来过滤结果。这意味着扫描整个集合,基本上是最慢的方法。
也只是显示编写它的“shell快捷方式”,否则function()
内容只是作为参数中的“字符串”提交到pymongo或其他语言驱动程序$where
,但基本上下文是在服务器上评估的JavaScript代码。
更好的方法是修改您的文档,使您想要查询的元素总是有一个一致的路径。比如:
{
"items": [
{ "name": "Item 1", "data": [["green", 1]] },
{ "name": "Item 2", "data": [["blue", 9], ["green", 1]] }
]
}
然后,您可以发出此简单查询:
db.my_data.find({ "items.data": { "$elemMatch": { "$elemMatch": { "$eq": "green" } } } })
由于“路径”始终是“items.data”
,因此仅针对该路径的单个条件就可以测试所有元素
我有超过15个字符串列表,每个列表包含几个不同的代码。每个列表包含一种特定类型的代码。我有一个输入代码,必须找出该输入代码属于哪个列表,并根据结果返回一个特定字符串。我用if,else if来做这个。下面是示例代码 每个列表如下所示:公共静态列表codeTypeOneList=新ArrayList(); (其他代码类型的类似列表) 有没有更好的方法来实现这一点?谢谢
问题内容: 关于你的第一个问题:该代码非常好,并且如果与其中的一个元素相等就可以正常工作。也许你尝试查找与其中一项不完全匹配的字符串,或者你使用的浮点值会导致不准确。 关于第二个问题:如果“查找”列表中的内容,实际上有几种可能的方法。 检查里面是否有东西 这是你描述的用例:检查列表中是否包含某些内容。如你所知,你可以使用in运算符: 过滤集合 即,找到满足特定条件的序列中的所有元素。你可以为此使用
如何找到python列表的中间位置? 这只是一个函数的例子,它可以找到任何列表的中间,你可以用列表理解来做这件事吗? 编辑:这与去掉中间点不同,因为我只想打印出中间值,如果列表是奇数,我想返回两个中间值,就像接受的答案一样。没有像另一个问题那样得到中值,而是得到两个值的平均值。
我有一个有点奇怪的问题。 我有一个“word”对象列表。“word”对象包含一个字符串myCWord,它等于传入word的字符串的规范版本。 规范形式是字符串中的排序字符。 现在我有了一个单词列表,在这里我可以访问它们所包含的字符串的规范版本。 我需要一个算法来创建“子列表”,这些列表包含一组单词,这些单词是每个单词的字谜。
如何在Python中找到列表的中值?列表可以是任何大小,并且不能保证数字按任何特定顺序排列。 如果列表包含偶数个元素,则函数应返回中间两个元素的平均值。 以下是一些示例(出于显示目的进行了分类):
我正在尝试编写一个方法,该方法可以在列表列表中找到对象的索引并利用并行性。这是我的代码。 当我运行以下代码时 输出类似于 换句话说,即使在找到对象之后,搜索仍在继续。不应该是短路操作吗?我错过了什么?此外,在迭代列表或锯齿数组时,利用并行性的最佳方法是什么? 编辑 按照@Sotirios回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。