【发布时间】:2014-10-24 09:51:31
【问题描述】:
我在 MongoDB 中保存了一个这样的文档列表:
{
"_id" : "f9f44e87-4260-4699-99a6-af6b58b4fb7e",
"address" : {},
"lastUpdate" : "1414083484838",
"listvalues" : {},
"userModels" : {
"5067" : {
"generated_date_timestamp" : NumberLong(1413985161866),
"model_id" : 5067,
"score_id" : {
"0" : {
"score_level_id" : 5267,
"confidence" : 0,
"generated_timestamp" : NumberLong(1413985161866)
}
},
"points" : 0,
"delta_points" : 0,
"override_model" : 0,
"override_score" : 0,
},
"5079" : {
"generated_date_timestamp" : NumberLong(1413985161866),
"model_id" : 5079,
"score_id" : {
"0" : {
"score_level_id" : 5292,
"confidence" : 0,
"generated_timestamp" : NumberLong(1413985161866)
}
},
"points" : 0,
"delta_points" : 0,
"override_model" : 0,
"override_score" : 0,
},
"5080" : {
"_class" : "com.mediresource.datatype.model.bean.Model",
"generated_date_timestamp" : NumberLong(1413985161866),
"model_id" : 5080,
"score_id" : {
"0" : {
"score_level_id" : 5294,
"confidence" : 0,
"generated_timestamp" : NumberLong(1413985161866)
}
},
"points" : 100,
"delta_points" : 0,
"override_model" : 0,
"override_score" : 0,
}
}
}
而且我需要计算 mongoDB 中所有 _id 的“userModels”有多少分超过 0 分。我在这里保存的是定义为UserModels<Integer, Model> 的Java HashMap。
这是我尝试使用的查询,但没有成功:
db.anonProfile.find(
{ "userModels": { $elemMatch: { "points": { $gte: 0 } } } }
).size();
有什么线索吗?
【问题讨论】:
-
您的数据中没有任何内容实际上是一个“数组”,它将以括号
[]表示法显示。这些只是子文档或哈希/映射结构,这就是它不起作用的原因。你有一些糟糕的代码产生这个。该结构不适合您的目的。 -
我可以创建一些游标来浏览数据吗?
-
这里的重点是您不希望“哈希/映射”结构与您使用它们的方式相同。这是一种“反模式”,它使查询和许多其他操作变得困难。数据就是数据,您不应该使用数据点作为键的名称。您想知道如何正确操作并解决您的问题吗?
-
我明白,重点是,这是来自生产环境,我无法更改。此查询仅用于报告目的。
-
那么你只剩下可怕的基于 JavaScript 的遍历选项,它比更有效的选项慢得多。我认为与老板交谈并展示这些 cmet 比给你一个表现不佳的答案更有效率。
标签: mongodb mapreduce mongodb-query aggregation-framework spring-data-mongodb