【问题标题】:Query array of embedded documents查询嵌入文档数组
【发布时间】: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


【解决方案1】:

您可以将其与spring-data mongodb 一起使用,例如:

Criteria criteria=Criteria.where("userModels.points").gte(0));
Aggregration aggregration=newAggregration(unwind("userModels"),match(criteria),group("_id").count().as("param"));

但我不明白你为什么使用userModels下的数字。这不好。因为我没有使用userModels下的numbers

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 2015-02-06
    • 2012-08-22
    • 2015-08-30
    • 1970-01-01
    • 2021-04-14
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多