繁体   English   中英

mongodb在哈希内的哈希内查找元素

[英]mongodb find element within a hash within a hash

我正在尝试构建一个从Mongo客户端运行的查询,该查询将允许访问哈希中哈希中以下元素的哈希。

这是数据的结构:

"_id" : ObjectId("BSONID"),
"e1" : "value",
"e2" : "value",
"e3" : "value"),
"updated_at" : ISODate("2015-08-31T21:04:37.669Z"),
"created_at" : ISODate("2015-01-05T07:20:17.833Z"),
"e4" : 62,
"e5" : {
    "sube1" : {
        "26444745" : {
            "subsube1" : "value",
            "subsube2" : "value",
            "subsube3" : "value I am looking for",
            "subsube4" : "value",
            "subsube5" : "value"
        },
        "40937803" : {
            "subsube1" : "value",
            "subsube2" : "value",
            "subsube3" : "value I am looking for",
            "subsube4" : "value",
            "subsube5" : "value"
        },
        "YCPGF5SRTJV2TVVF" : {
            "subsube1" : "value",
            "subsube2" : "value",
            "subsube3" : "value I am looking for",
            "subsube4" : "value",
            "subsube5" : "value"
        }
    }
}

因此,我基于db.my_collection.find({“ e5.sube1.subsube4”:“我要寻找的值”})建议根据“建议”将通配符“散列”为散列的点符号进行了尝试,该提示不断出现空结果集。 我也尝试使用匹配而不是使用/ value的确切值来查找,但我仍然是lo /,并且结果集仍然为空。 我知道至少有1个文档具有“我正在寻找的价值”。

任何想法-请注意,我仅限于使用Mongo Shell客户端。

谢谢。

您有两个问题:

  • 您缺少一个级别。
  • 您正在检查subsube4而不是subsube3

根据要检查的sube1子文档,您应该执行

db.my_collection.find({"e5.sube1.26444745.subsube4": "value I am looking for"})

要么

db.my_collection.find({"e5.sube1.40937803.subsube4": "value I am looking for"})

要么

db.my_collection.find({"e5.sube1.YCPGF5SRTJV2TVVF.subsube4": "value I am looking for"})

如果要查看三个中的任何一个,可以使用$ or运算符

如果您不知道文档的键,那么这就是架构设计的问题:您应该使用数组而不是对象。 相似案例: 如何查询动态键-mongodb模式设计

编辑

由于您解释了一次特殊的要求才能知道"value I am looking for"的计数,因此我们可以运行map reduce 您可以在外壳中运行这些命令。

定义地图功能

var iurMapFunction = function() {
    for (var key in this.e5.sube1) {
        if (this.e5.sube1[key].subsube3 == "value I am looking for") {
            var value = {
                count: 1,
                subkey: key
            }
            emit(key, value);
        }
    }
};

定义归约函数

var iurReduceFunction = function(keys, countObjVals) {
    reducedVal = {
        count: 0
    };
    for (var idx = 0; idx < countObjVals.length; idx++) {
        reducedVal.count += countObjVals[idx].count;
    }
    return reducedVal;
};

运行mapreduce命令

db.my_collection.mapReduce(iurMapFunction,
    iurReduceFunction, {
        out: {
            replace: "map_reduce_result"
        },
    }
);

查找计数

db.map_reduce_result.find()

对于您对象中的每个动态键,这应该为您提供其具有值为0的value I am looking for的嵌入式字段subsube3的次数。

因此,由于无法将其转换为javascript / mongo shell数组,因此我将转到计划B,该计划编写一些代码(无论是Perl还是Ruby),然后将结果集放入哈希数组中,并遍历每个文档/子文档。

感谢Mario的帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM