在 mongodb 的多个字段上执行不同的操作

Posted

技术标签:

【中文标题】在 mongodb 的多个字段上执行不同的操作【英文标题】:performing distinct on multiple fields in mongodb 【发布时间】:2017-04-03 03:29:20 【问题描述】:

假设我们有如下文档集合:

[

"name" : "john",
"age" : 23,
"city": "New York",
"gender": "M"
,

"name" : "doe",
"age" : 30,
"city": "dubai",
"gender": "M"
,

"name" : "jean",
"age" : 23,
"city": "New York",
"gender": "F"


"name" : "phil",
"age" : 24,
"city": "Ohio",
"gender": "M"

]

预期输出:


"name" : ["john","doe","jean","phil"],
"age" : [23,30,24],
"city": ["New York","Dubai","Ohio"],
"gender": ["M","F"]

我尝试使用 mongodb 的 distinct ,但这只会返回一个特定字段的唯一值...我认为我们不能在不同的查询中传递多个字段...

【问题讨论】:

你想要任何序列中所有键的唯一值吗? 【参考方案1】:

$addToSet 专门用于此类事情。

db.coll.aggregate([
$group: 
    _id: null,
    name: $addToSet: '$name',
    age: $addToSet: '$age',
    city: $addToSet: '$city',
    gender: $addToSet: '$gender'
    
])

给出输出 -

 "_id" : null, "name" : [ "phil", "jean", "doe", "john" ], "age" : [ 24, 30, 23 ], "city" : [ "Ohio", "dubai", "New York" ], "gender" : [ "F", "M" ] 

【讨论】:

太棒了!请注意_id 必须包含在$group 中。关于 SO 的唯一答案之一,有一个很好的例子。 如果我也想获取 _id 怎么办?? 如何在 Spring Boot 中为 _id 为 null 编写相同的代码,我写在下面的代码但它给出了错误 - 任何建议请给我 Aggregation agg = Aggregation.newAggregation(Map.class,Aggregation.group( "?").addToSet("name").as("name").addToSet("details").as("details")); AggregationResults aggregate = template.aggregate(agg, "products", Map.class);

以上是关于在 mongodb 的多个字段上执行不同的操作的主要内容,如果未能解决你的问题,请参考以下文章

mongoDB_08索引的操作

多个子字段的 MongoDB 查询匹配

《MongoDB入门教程》第22篇 聚合操作

《MongoDB入门教程》第22篇 聚合操作

《MongoDB入门教程》第22篇 聚合操作

mongoDB分片集群