我正在尝试构建一个从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客户端。
感谢。
答案 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,并将结果集拉成一个哈希数组并遍历每个文档/子文档。
感谢马里奥的帮助。