【问题标题】:How to aggregate values in an array of objects in MongoDB如何在 MongoDB 中聚合对象数组中的值
【发布时间】:2017-01-19 18:27:02
【问题描述】:

我存储来自汽车的文档,想以数组的形式获取所有梅赛德斯汽车的温度,在 Mongodb 中应该如何查询?

 { "_id" : { "$oid" : "5880ff305d15f416c89457b7" },
     "car" : "mercedes",
      "engine" : { 
            "sensor" : {
                        "temperatur" : "20",
                        "speed" : "100", 
                        "hue" : "40" 
                        }
                },
         "motor" : {
                    "Power" : "155", 
                    "Topspeed" : "400" 
                    } 
}

{ "_id" : { "$oid" : "5880ff305d15f416c89457b7" },
     "car" : "mercedes",
      "engine" : { 
            "sensor" : {
                        "temperatur" : "50",
                        "speed" : "100", 
                        "hue" : "40" 
                        }
                },
         "motor" : {
                    "Power" : "155", 
                    "Topspeed" : "400" 
                    } 
}

我想为所有梅赛德斯汽车选择温度并接收它。 结果应该是 [20,50]

编辑: 我的代码看起来像下面使用 JAVA 的 iam:

  MongoClient mongoClient = new MongoClient();
      MongoDatabase database = mongoClient.getDatabase("test");
      MongoCollection<Document> coll = database.getCollection("myTestCollection");

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework mongo-java mongo-java-driver


    【解决方案1】:

    如果你对不同的值没问题,你可以尝试这样的常规查询。

    db.cars.distinct("engine.sensor.temperatur", {"car" : "mercedes"});
    

    这会给你

    [ "20", "50" ]
    

    更新 - Java 等效项:

    List<String> temps = coll.distinct("engine.sensor.temperatur", new Document("car", "mercedes"), String.class).into(new ArrayList<>());
    

    更新 - 聚合选项

    Bson match = new Document("$match", new Document("car", "mercedes"));
    
    Bson group = new Document("$group", new Document("_id", "$car").append("temps", new Document("$push", "$engine.sensor.temperatur")));
    
    List<String> temps  = (List<String>) coll.aggregate(Arrays.asList(match, group)).map(document -> document.get("temps")).first();
    

    【讨论】:

    • 汽车是指收藏名称吗?我应该如何处理我的测试数据库和 myTestCollection 集合?
    • 是的。只需将cars 替换为myTestCollection
    • 和分贝?我应该用数据库替换它吗?我得到一个错误。令牌上的语法错误,错位的结构
    • 首先更改为test db。 use test 之类的东西,然后运行查询。在答案中也添加了 java 等价物。
    • 那是 mongo 控制台查询。
    猜你喜欢
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 2018-04-20
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    相关资源
    最近更新 更多