如何聚合 MongoDB 中对象数组中的值
How to aggregate values in an array of objects in MongoDB
我存储来自汽车的文档,并希望将所有梅赛德斯汽车的温度作为数组获取,查询应该如何在 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"
}
}
我想 select 所有梅赛德斯汽车的温度并接收它。
结果应该像 [20,50]
编辑:
我的代码看起来像下面的 iam 使用 JAVA:
MongoClient mongoClient = new MongoClient();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> coll = database.getCollection("myTestCollection");
如果您不介意不同的值,您可以在常规查询中尝试类似的操作。
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();
我存储来自汽车的文档,并希望将所有梅赛德斯汽车的温度作为数组获取,查询应该如何在 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"
}
}
我想 select 所有梅赛德斯汽车的温度并接收它。 结果应该像 [20,50]
编辑: 我的代码看起来像下面的 iam 使用 JAVA:
MongoClient mongoClient = new MongoClient();
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> coll = database.getCollection("myTestCollection");
如果您不介意不同的值,您可以在常规查询中尝试类似的操作。
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();