goclub/mongo
Github 官方原文

开始

本教程指导您将测试数据插入到 MongoDB 数据库中, 并使用 goclub/mongo查询数据。

插入

将 document 存储在 collections 中。集合类似于关系数据库中的表。如果一个集合不存在,MongoDB 将在您第一次为该集合存储数据时创建该集合。

下面的示例使用 Collection.InsertMany 方法将新文档插入到电影集合中。

将存储在集合中。集合类似于关系数据库中的表。如果一个集合不存在,MongoDB 将在您第一次为该集合存储数据时创建该集合。

下面的示例使用 Collection.InsertMany 方法将新文档插入到电影集合中。

goclub/mongo 使用了 DocumentManyDocument 作为一些方法的入参,定义一些满足 Document ManyDocument 接口的结构体能让减少很多重复的工作量.让代码更健壮

点击查看示例代码

插入操作会返回包含每个成功插入的文档的 _id 的数组。 Collection.InsertMany 会自动将这些 _id 赋值给 mo.ManyExampleMovie, 因为 mo.ManyExampleMovie 实现了

func (many ManyExampleMovie) BeforeInsertMany(data BeforeInsertManyData) (err error) {
	IDs := data.ObjectIDs()
	for i,_ := range many {
		many[i].ID = IDs[i]
	}
	return
}

要验证插入,可以查询集合

查询全部文档

要从集合中查询文档,可以使用 Collection.Find 方法。 若要选择集合中的所有文档,请将一个空的 bson.M{} 作为查询筛选器文档传递给该方法。

点击查看示例代码

按条件查询数据

你可能看到 bson.M bson.D bson.A bson.E 会有点懵 如果基于 json 去理解: bson.A 表示 array, bson.Dbson.M 对应 object 因为 go 的map遍历时是无序的所以一般情况下操作符(filter)类型的参数用 bson.M,插入数据类型时用 bson.D bson.E 是用来实现 bson.D的,自己去看下他们的源码就能很快理解了

在 filter 中设置查询条件传递给 Collection.Find 方法。

查询2000年之前发布的电影:

filter := bson.M{
    "released": bson.M{
        "$lt": time.Date(2000,1,1,0,0,0,0, time.UTC), // 中国时区用 time.FixedZone("CST", 8*3600) 代替 time.UTC
    },
}

查询获得100多个奖项的电影:

filter := bson.M{
    "awards.wins": bson.M{
        "$gt": 100,
    },
}

查询 languages 包含JapaneseMandarin的电影:

filter := bson.M{
    "languages": bson.M{
        "$in": []string{"Japanese", "Mandarin"},
    },
}

点击查看示例代码

指定返回字段

要指定要返回的字段,请将一个mo.FindCommand{ Projection: bson.M{...} }传递给 Collection.Find 方法。

  • <field>: 1 在返回的文档中包含字段
  • <field>: 0 在返回的文档中排除字段

在 Go 中,运行以下查询,返回电影集合中所有文档的 idtitledirectorsyear字段:

cursor, err := moviesColl.Find(ctx, filter, mo.FindCommand{
        Projection: bson.M{
            "title": 1,
            "directors": 1,
            "year": 1,
        },
    }) ; if err != nil {
    return
}
    list := []bson.M{}
    err = cursor.All(ctx, &list) ; if err != nil {
    return
}

您不必指定 _id 字段来返回该字段。默认情况下它会返回。若要排除该字段,请在 projection 中将其设置为0。例如,运行以下查询只返回标题和匹配文档中的类型字段:

cursor, err := moviesColl.Find(ctx, filter, mo.FindCommand{
    Projection: bson.M{
        "_id": 0,
        "title": 1,
        "genres": 1,
    },
}) ; if err != nil {
    return
}
list := []bson.M{}
err = cursor.All(ctx, &list) ; if err != nil {
    return
}

点击查看示例代码

聚合

可以使用聚合对多个文档中的值进行分组,并返回单个结果。MongoDB 中的聚合是通过聚合管道执行的。

虽然 find() 操作也可以查询数据,但是与简单的 CRUD 操作相比,聚合管道允许您操作数据、执行计算和编写表达能力更强的查询。

在 shell 中,运行以下聚合管道来计算每种类型值的出现次数:

db.movies.aggregate( [
   { $unwind: "$genres" },
   {
     $group: {
       _id: "$genres",
       genreCount: { $sum: 1 }
     }
   },
   { $sort: { "genreCount": -1 } }
])

因为 5.0 版本之前不支持 $group: {_id: "$genres", genreCount: { $count: { } } } 所以本文档使用 $sum: 1 代替 $group 中的 $count.

管道用途:

点击查看示例代码

其他例子

查询文档示例

更新文档示例

删除文档示例