当前位置: 首页 > 知识库问答 >
问题:

MongoDB在列表列表中查找值

茹高义
2023-03-14

我正在使用MongoDB搜索包含列表列表的元素,其中列表中至少有一个项目与搜索参数匹配。

这是我目前拥有的结构的一个例子。

{  
   "Item 1":{  
      "data":[  
         ["green", 1]
      ]
   },
   "Item 2":{  
      "data":[  
         ["blue", 9],
         ["green", 1]
      ]
   }
}

我想搜索数据列表中值为“绿色”的所有项目。

我目前有这个:

my_data.find({'data': {'$in': ['green']}})

但是,不会返回任何结果。

共有1个答案

荀子轩
2023-03-14

您需要一个到任何查询元素的“直接路径”,“数据”不是您需要在此搜索的路径的“顶层”,而是文档中的“项目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回答中的想法,我得到了以下输出 请注意 即使找到答案也继续搜索。