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

时间:2015-09-01 15:38:24

标签: mongodb hash mongo-shell

我正在尝试构建一个从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"
        }
    }
}

所以我根据对#34;潜水"的建议尝试了点缀符号。使用db.my_collection.find({" e5.sube1.subsube4":"我正在寻找的值#34;})进入一个名为hash的通配符,它​​继续返回一个空的结果集。我也尝试使用匹配而不是精确值使用/ value我是lo /仍然是一个空结果集。我知道至少有一个文件具有我正在寻找的"值#34;。

任何想法 - 请注意我只能使用Mongo shell客户端。

感谢。

2 个答案:

答案 0 :(得分:0)

您有两个问题:

  • 你错过了一个级别。
  • 您正在检查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 operator

如果您不知道文档的密钥,那么架构设计就会出现问题:您应该使用数组而不是对象。类似案例:How to query a dynamic key - mongodb schema design

修改

由于您解释说您只有一次特殊请求知道"value I am looking for"的计数,我们可以运行map reduce。您可以在shell中运行这些命令。

定义地图功能

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()

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

答案 1 :(得分:0)

因此,由于这不能被制作成javascript / mongo shell数组,所以我将去B计划写一些代码,比如Perl或Ruby,并将结果集拉成一个哈希数组并遍历每个文档/子文档。

感谢马里奥的帮助。