复合索引查询
MongoDB支持复合索引,可以在多个字段上创建索引。这样就可以通过一个查询条件来筛选出数据集的子集,并且只需要扫描这个子集而不是整个数据集,从而提高查询效率。
假设我们有一个用户信息表users,其中包含name、age和gender三个字段。如果我们经常需要按照age和gender两个字段来进行查询,那么可以为这两个字段创建复合索引:
collection.Indexes().CreateOne(context.Background(), mongo.IndexModel{
Keys: bson.M{
"age": 1,
"gender": 1,
},
})
然后就可以通过Find()函数来进行查询了:
filter := bson.M{“age”: bson.M{“$gt”: 25}, “gender”: “male”} cur, err := collection.Find(context.Background(), filter)
聚合查询
聚合操作是指将多条记录归并为一条记录的过程。MongoDB中提供了强大的聚合框架,能够灵活地对文档进行分组、筛选、排序等操作。
下面以统计每个年龄段男女各有多少人为例,演示如何使用MongoDB进行聚合查询:
pipeline := []bson.M{
{
"$group": bson.M{
"_id": bson.M{"age_group": "$age_group", "gender": "$gender"},
"count": bson.M{"$sum": 1},
},
},
} cur, err := collection.Aggregate(context.Background(), pipeline)
首先通过\(group操作将所有相同年龄段和性别的文档进行分组,并统计各组的记录数,然后通过\)sum操作对每个分组内的文档数量进行求和。最终得到的结果类似于下面这样:
[
{"_id": {"age_group": 20, "gender": "male"}, "count": 15},
{"_id": {"age_group": 20, "gender": "female"}, "count": 10},
{"_id": {"age_group": 30, "gender": "male"}, "count": 12},
{"_id": {"age_group": 30, "gender": "female"}, "count": 8},
...
]
其中_id字段表示分组条件,count字段表示该分组内的文档数量。