Mongodb 无论文档中的字段位置如何,任何noSql数据库都可以按特定字段获取数据吗?

Mongodb 无论文档中的字段位置如何,任何noSql数据库都可以按特定字段获取数据吗?,mongodb,couchdb,nosql,Mongodb,Couchdb,Nosql,例如,如果数据库中有以下文档: > db.things.find() [ {"_id" : {"$oid" : "4e0748eecc93747e680421c7"}, "title" : "aaaa"}, {"_id" : {"$oid" : "4e074954cc93747e680421c8"}, "desc" : "bbb", "children" : [ {"title" : "ccc"}

例如,如果数据库中有以下文档:

> db.things.find()
[ 
  {"_id" : {"$oid" : "4e0748eecc93747e680421c7"},
          "title" : "aaaa"},
  {"_id" : {"$oid" : "4e074954cc93747e680421c8"},
          "desc" : "bbb",
          "children" : [
            {"title" : "ccc"},
            {"title" : "ddd"}
            ]
  }
  {"_id" : {"$oid" : "4e074a5abbdr4664546e59334"},
          "desc" : "none",
          "children" : [
            {"desc" : "ccc"}
            ]
  }
]
我想获取所有包含“title”字段的文档,但我不知道该字段在文档中的位置。
Mongodb/Couchdb或任何其他文档数据库是否具有这种查询选项?

Mongodb中不提供这种到处搜索功能-至少不是现成的,也不是通用的。Map Reduce与处理嵌套文档的相关实现是一个选项,或者应用程序端过滤是另一个选项。

您可以通过CouchDB Map Reduce查询来实现这一点。您需要编写一个递归搜索文档中指定字段的函数。由于CouchDB仅以增量方式更新视图索引,因此仅在每次创建或更新文档时才进行搜索

如果您想要一些实际的源代码来编写这样一个映射函数,我相信我可以想出一些东西。但使用CouchDB是可能的。:)

编辑:我花了几分钟修改了一个递归扫描函数。它还没有完全测试过,但是如果它还没有工作的话,对你来说应该是一个很好的开始

我为类型测试添加了两个方便的函数,主要函数名为
scan
。它需要两个参数,一个输入和一个函数来调用每个匹配

它将通过输入循环。如果输入是一个对象,它将检查该对象的键;如果是一个数组,它将递归调用
scan
,查找数组中的每个项。一旦输入是一个对象,它将检查每个键,如果名称是
title
,它将使用值作为第一个参数调用传递的函数。否则,如果值是另一个对象或数组,它将调用
scan

在map函数的末尾,它传入文档,以及一个只调用
emit
和标题值的函数

function (doc) {
    function is_array(input) {
        return (input.constructor.toString().indexOf("Array") != -1);
    }

    function is_object(input) {
        return (typeof input === "object" && input !== null);
    }

    function scan(obj, func) {
        if (!obj || !is_object(obj)) {
            return false;
        }

        var x;

        if (is_object(obj)) {
            for (x in obj) {
                if (x.toLowerCase() === "title") {
                    func(obj[x]);
                } else {
                    scan(obj[x], func);
                }
            }
        } else if (is_array(obj)) {
            for (x = 0; x <= obj.length; x++) {
                scan(obj[x], func);
            }
        }
    }

    scan(doc, function (value) {
        emit(value);
    });
}
功能(doc){
函数为_数组(输入){
返回(input.constructor.toString().indexOf(“数组”)!=-1);
}
函数是对象(输入){
返回(输入类型==“对象”&&input!==null);
}
功能扫描(obj、func){
如果(!obj | |!is_对象(obj)){
返回false;
}
var x;
if(is_object(obj)){
用于(obj中的x){
if(x.toLowerCase()=“title”){
func(obj[x]);
}否则{
扫描(obj[x],func);
}
}
}else if(is_数组(obj)){

对于(x=0;x谢谢,但是如果我要使用map reduce,我将不得不“扫描”所有文档,这可能会降低数据库性能,对吗?权限…正如所说的:MongoDBThanks中没有通用的解决方案详细的答案,这可能就是解决方案。但是如果我有很多键(本例中的“标题”只是其中一个键),该怎么办我还希望能够灵活地将它们与动态值进行比较。这意味着我希望获得键“some_key”(我不知道它在文档中的位置)等于值“some_value”的所有文档。我可以为此创建一个高效的视图吗?您可以创建一个类似的视图,为文档中的每个键发送一个键/值对。这将是一个更大的视图,但这是可能的。不过,您最好创建单独的预定义查询。