🦍

MongoDBとGolangでいいね機能を実装する

2022/04/19に公開

当たり前になったいいね機能

ZennやQiitaのようなブログを作成する時の機能として、いいね機能がないサービスは少ないと思います。
どのように実装するのかや仕組みの理解が乏しかったので自分なりに実装してみました。
※この実装であっているのか自信がないので、参考程度にお願いします。

Model(Entity)

記事IDに対して、いいねしているユーザーをもつテーブルです。
いいねしているユーザーの情報は、ユーザーIDといいねした時の時間を記録しています。

models.go
type Like struct {
	ArticleID primitive.ObjectID `json:"articleID,omitempty" bson:"articleID,omitempty"`
	Users     []LikeUser         `json:"users" bson:"users"`
}

type LikeUser struct {
	UserID    primitive.ObjectID `json:"_id" bson:"_id"`
	Timestamp time.Time          `json:"timestamp" bson:"timestamp"`
}

メイン処理

すでにいいねされている(テーブルのUsersにユーザーIDが存在する)場合は、削除
いいねがされていない場合は追加する処理です。

like.go
// UpdateLike Likeを押したら更新する
func UpdateLike(ctx *gin.Context) {
	var like entity.LikeUser
	var user entity.LikeUser
	var result bool
	getPostID := 記事IDを取得
	getUserID := ユーザーIDを取得
	id, _ := primitive.ObjectIDFromHex(getUserID)
	postID, _ := primitive.ObjectIDFromHex(getPostID)
	checkFilter := bson.M{"articleID": postID, "users._id": id}
	filter := bson.M{"articleID": postID}

	// LIKEテーブルに存在するかチェック
	isErr := LikeCollection.FindOne(context.TODO(), checkFilter).Decode(&user)

	like.UserID = id
	like.Timestamp = time.Now()

	update := bson.M{"users": like}

	if isErr == nil {
		// 記事のいいねを削除する
		if _, err := LikeCollection.UpdateOne(context.TODO(), filter, bson.M{"$pull": bson.M{"users": bson.M{"_id": id}}}); err != nil {
			// エラーの場合の処理
			return
		}
		result = false
	} else {
		// 記事のいいねに追加する
		if _, err := LikeCollection.UpdateOne(context.TODO(), filter, bson.M{"$push": update}); err != nil {
			// エラーの場合の処理
			return
		}
		result = true
	}
	・・・
}
likeテーブル
> db.likes.find()
{ "_id" : ObjectId("625a5484df878a0459f0d1a0"), "users" : [ { "_id" : ObjectId("625a71ee5d48be1bb2a1fa1b"), "timestamp" : ISODate("2022-04-16T14:18:15.499Z") }, { "_id" : ObjectId("625a5441df878a0459f0d19d"), "timestamp" : ISODate("2022-04-18T17:12:37.413Z") } ], "articleID" : ObjectId("625a5484df878a0459f0d19e") }

コードとしてはこんな感じ。
もっといい方法があると思う。

いいね機能の仕組み

  1. 「いいね」されたらlikeテーブルからレコードがあるか検索
  2. レコードがなければレコードを追加、レコードがあれば削除する

詰まったところ

mongoDB公式のGo用のDriverを触りたてなのと、日本語の記事があまりないので苦戦した。
テーブル内の配列から該当のユーザーIDを追加・削除するようなコードをどうするかで詰まりました。

初投稿で拙い部分があると思いますが、見てくださりありがとうございます。

Discussion