データストアは任意のデータを保存できるようになっています。数字やテキスト、真偽値、位置情報などはもちろんのこと、他のデータストアのクラスをポインターとして保存することでオブジェクト同時の関連を表現できるようになっています。
今回はそんなポインターを使ってソーシャルサービスでよくある、フォロー/フォロワーの仕組みを作ってみたいと思います。
フォローの仕組み
まずフォロー/フォロワーの仕組みですが、これはユーザデータ同士の関連を表現することになります。今回はFollowというクラスを指定します。
var Follow = ncmb.DataStore("Follow");
他のユーザをフォローするユーザはログインしていることとします。
var user1 = new ncmb.User({userName:"user1", password: "password1"}); ncmb.User.login(user1) .then(function() { console.log("Logged in") user1 = ncmb.User.getCurrentUser();
そして別なユーザを探します。
ncmb.User.where({userName: "user2"})
.fetch()
.then(function(user2) {
ユーザがいれば、フォロークラスのインスタンスを作成し、データを追加します。
var follow = new Follow; follow.set("user", user1) .set("follower", user2) .save() .then(function(follow) { console.log(follow); }); }) .catch(function(err) { console.error(err); });
これで、 follow.user にはフォローするユーザが、follow.followerにはフォローされたユーザが入ります。なお、注意点としてユーザ情報にPublic Read権限をつけるのを忘れないでください。デフォルトはそのユーザのみ自分の情報が見られるようになっています。
フォローしているユーザを検索する
では次にフォローしているユーザの一覧をとってみたいと思います。
フォロー情報は一般的に公開情報なので、ログインではなくユーザ検索を使います。
ncmb.User.where({userName: "user1"}) .fetch() .then(function(user1) {
そして、Followクラスの中を「ポインタオブジェクト」として検索します。
var Follow = ncmb.DataStore("Follow"); Follow.equalTo("user", {"__type": "Pointer", "className": "user", "objectId": user1.objectId}) .include("user") .fetchAll() .then(function(follows) { console.log(follows); }) .catch(function(err) { console.error(err); })
このようにすることで、user1がフォローしているユーザの一覧が取得できます。Followクラスだけ取得してポインターしか取得できませんので、 .include("user")
としてあげるのがコツです。
この場合、データストアの取得できる最大件数までは1回のAPIコールで取得できます。
フォローの逆、フォロワーを取得する場合はuserカラムではなく、followカラムを検索してあげれば良いでしょう。
ポインターを使うことでフォロー/フォロワーの仕組みも実現できます。ぜひお試しください。