私はこのようなサンプルスキーマを持っています -
Comment.add({
text:String,
url:{type:String,unique:true},
username:String,
timestamp:{type:Date,default:Date}
});
Feed.add({
url:{type:String, unique:true },
username:String,
message:{type:String,required:'{PATH} is required!'},
comments:[Comment],
timestamp:{type:Date,default:Date}
});
今、私は _id フィールドを外の世界に公開したくないので、どこのクライアントにも送信していません。これで、コメント スキーマに 2 つの重要なプロパティ (ユーザー名、URL) ができました。やりたいことは、条件を満たすサブ ドキュメントのコンテンツを更新することです
- feed.url
- コメント.url
- コメント.ユーザー名
comment.username
がクライアントの値と同じである場合は、変数でクライアントによって提供された URL を持つレコードreq.user.username
のプロパティを更新します。comment.text
req.body.url
私が考えた長くて時間のかかるアプローチの 1 つは、最初に指定された URL のフィードを見つけてから、すべてのサブドキュメントを繰り返し処理して条件を満たすドキュメントを見つけ、そうであればコメント オブジェクトを更新するかcomment.url==req.body.url
どうかを確認することです。comment.username==req.user.username
しかし、これを行うより簡単な方法があるに違いないと思いますか?私はすでに試しました-
db.feeds.update({"username":"harshitladdha93@gmail.com","comments.username":"harshitladdha3@gmail.com","comments.url":"test"},{$set:{"comments.$.text":"updated text 2"}})
http://www.tagwith.com/question_305575_how-to-find-and-update-subdocument-within-array-based-on-parent-propertyから見つかりました
comments.url
ただし、これはまたはcomments.username
が他のサブドキュメントと一致する場合でも更新されます
そして私も試しました
db.feeds.distinct("comments._id",{"comments.url":req.body.url})
に関連付けられているドキュメントの _id を検索しますが、サブドキュメント内のurl
すべてを返します_id