我将一些杂乱的XML数据导入Mongo数据库.每个文档都有嵌套的子文档,深度约为5-10.我想查找()文档,这些文档具有特定字段的特定值,该字段可能出现在子文档的任何深度(并且可能出现多次).

目前,我正在将每个文档拉入Python,然后搜索该字典,但如果我可以声明一个过滤器原型,其中数据库只返回在其内容中某处具有特定字段名值的文档,那就太好了.

以下是一个示例文档:

{
    "foo": 1,
    "bar": 2,
    "find-this": "Yes!",
    "stuff": {
        "baz": 3,
        "gobble": [
            "wibble",
            "wobble",
            {
                "all-fall-down": 4,
                "find-this": "please find me"
            }                
        ],
        "plugh": {
            "plove": {
                "find-this": "Here too!"
            }
        }
   }
}

所以,我想查找具有"find this"字段的文档,并且(如果可能的话)能够查找具有"find this"字段特定值的文档.

推荐答案

你是对的,BSON文档不是XML文档.由于XML被加载到由" node "组成的树 struct 中,所以在任意键上搜索非常容易.

MonoDB文档的处理并不是那么简单,而且在很多方面它都是一个"数据库",因此通常希望它的数据位置具有一定的"一致性",以便易于"索引"和搜索.

尽管如此,这是可以做到的.但这当然意味着在服务器上执行一个递归过程,这意味着使用$where的JavaScript处理.

作为一个基本的shell示例,但general function只是$where运算符在其他地方的字符串参数:

db.collection.find(
  function () {
    var findKey = "find-this",
        findVal = "please find me";

    function inspectObj(doc) {
      return Object.keys(doc).some(function(key) {
        if ( typeof(doc[key]) == "object" ) {
          return inspectObj(doc[key]);
        } else {
          return ( key == findKey && doc[key] == findVal );
        }
      });
    }
    return inspectObj(this);
  }
)

所以基本上,测试对象中的键,看看它们是否匹配所需的"字段名"和内容.如果其中一个键恰好是一个"对象",那么它将递归到函数中并再次判断.

JavaScript .some()确保找到的"第一个"匹配将从搜索函数返回,给出true个结果,并返回在某个深度存在"键/值"的对象.

请注意,$where基本上意味着遍历整个集合,除非有其他有效的查询筛选器可以应用于集合上的"索引".

因此,请谨慎使用,或者干脆不使用,只需将数据重新构造为更可行的形式即可.

但这会让你找到你的对手.

Mongodb相关问答推荐

在MongoDB中使用explain()和查询时缺少winningPlan''''

MongoDB 按 created_at 月聚合

mongodb.将文档分组在数组中,对它们进行评分计数和求和并添加新字段

将数据从一个集合插入另一个集合的聚合

Spring Boot 升级后未映射 Mongo 模板结果

MongoDB shell:如何删除列表以外的所有集合

Mongodb 按数组元素聚合组

从 MongoDB 中的聚合结果中获取不同的值

根据聚合管道MongoDB Atlas触发器中的条件更新多个字段

增加嵌套对象中的值?

如何在 MongoDb 中进行类似于嵌套 Sql Select 查询的嵌套查询

加载时将 mongo 存储的日期转换回自 Unix 纪元以来的毫秒数?

通过 Spring Boot 应用程序访问 mongodb 时的身份验证错误

启动mongodb和express的正确方法?

在 mongodb 的一次更新调用中推送到两个单独的数组

用于嵌入式集合的 MongoDB 首选模式.文档与数组

在 Ubuntu 13.10 (saucy) 中安装 Mongodb PHP 扩展的最简单方法?

如何在 Ubuntu 10.04 中使用 --auth 选项重新启动 mongodb?

AsQueryable 方法是否在新的 Mongodb C# 驱动程序 2.0rc 中离开?

我可以使用字符串作为 mongodb 文档的 ID 类型吗?