0

私はこのようなサンプルスキーマを持っています -

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) ができました。やりたいことは、条件を満たすサブ ドキュメントのコンテンツを更新することです

  1. feed.url
  2. コメント.url
  3. コメント.ユーザー名

comment.usernameがクライアントの値と同じである場合は、変数でクライアントによって提供された URL を持つレコードreq.user.usernameのプロパティを更新します。comment.textreq.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

4

1 に答える 1

1

_idまず第一に、セキュリティの観点から、外の世界に見られないことに頼るべきではありません。これは、多くの理由から非常に悪い考えです (主に REST と、すべてのクエリでデフォルトで返されるという事実)。

さて、あなたの質問に答えるために、あなたが欲しいのは$elemMatch演算子です。これは、配列内の指定されたサブドキュメントが複数のクエリに一致するものを探していることを示しています。

例えば

db.feeds.update({
    "username":"harshitladdha93@gmail.com",
    comments: {
        $elemMatch: {
            username: "harshitladdha3@gmail.com",
            url: "test"
        }
    }
}, {$set: {"comments.$.text":"updated text 2"}})

使用しない場合$elemMatch、コメントのいずれかがクエリに一致する場合、つまり、ユーザー「harshitladdha3@gmail.com」によるコメントがあり、別のコメントに「 test」を使用しない限り、ドキュメントは一致します$elemMatch

于 2015-03-16T22:17:57.840 に答える