1

次のマングーススキーマが定義されています...

var BlogSchema = new Schema({
    content: String,
    comments:[CommentSchema], //embed the comments
    owner: {type: ObjectId , ref: 'User'}
})


var CommentSchema = new Schema({
   commentContent : String,
   commentPostTime : Number,
   likes :  [{type: ObjectId , ref: 'User'}],
   likeCount: {type: Number, default:0}
})

var UserSchema = new Schema({


})

ユーザーがコメントを気に入ったとき。ユーザーをいいね! リストに追加し、ブログ ドキュメントに埋め込まれたコメント サブドキュメントを更新する必要があります。これを達成する方法がわかりません。

助けていただければ幸いです。

4

1 に答える 1

2

UserSchema には多くの情報が含まれていないため、Mongoose の人口機能を使用して結合を偽造しようとしなければ、おそらく最も簡単です。MongoDB を単独で使用すると、これを 1 回の操作で実行できます。以下では、参照したいユーザードキュメントの「_id」フィールドを保存しています。

> var userID = userdoc._id;
> db.comments.update( { _id : commentID }, 
              { $push : { likes : userID } } );

これを Mongoose で行うには、スキーマを少し変更する必要があります。

var CommentSchema = new Schema({
   commentContent : String,
   commentPostTime : Number,
   likes :  [ObjectId],
   likeCount: {type: Number, default:0}
})

次に、新しいユーザーをいいねのリストに追加し、次のクエリで likeCount フィールドをインクリメントします。

Comment.findByIdAndUpdate( commentID, { $push : { likes : "samantha" }, $inc : { likeCount : 1 } } );

これはマングース人口を使用するよりも優れていますか? この方法でデータを処理すると、コメントからユーザーを検索するときに追加の手順が必要になります。最初に、コメント内のいいね! のリストからユーザー ID を取得する必要があります。次に、別のクエリを実行して、そのユーザーのドキュメントを取得する必要があります。ただし、ユース ケースではユーザー ドキュメントを検索する必要がないように思われるため、このアプローチは適切に機能するはずです。パフォーマンスに関して言えば、この 2 段階のプロセスは、Mongoose がその集団メソッドを使用して内部で行っていることだと思います。個人的には、自分のデータをより細かく制御できる代わりに、追加のルックアップ ステップを使用しても問題ありません。

于 2013-09-18T15:37:51.357 に答える