2016-09-21 8 views
3

で、新たに埋め込まれた文書を取得、私はコメントはPageモデルに追加されているページマングース

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, (err, page) => { 
    // ... 
}); 

に埋め込まれた文書を追加するためにこれを使用すると、自動的にidを与えられています。

IDを与えられた後に、これらの新しく挿入されたコメントを返したいと思います。

だから、私は、私はそれらをデータベースに挿入する前に、1つのオプションは、アレイcommentsにIDを追加することができることを知っているが、私は可能な場合は、これを省略したい

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, (err, page) => { 
    return page.newlyAddedComments(); 
}); 

ような何かをしたいです。

+0

オプションで「新しい」を試しましたか? –

+1

私は 'new'オプションについて読んでいます。 '{new:true}'オプションを使って 'page.comments'を返すとうまくいくでしょうが、私はすべてのコメントを返すつもりはありません。私は新しく挿入されたコメントを返すだけです – Jamgreen

+1

私が知っているように、埋め込まれたドキュメントだけは更新結果で分けることができません。 –

答えて

0

@Shriram Manoharan氏によると、埋め込み文書を検索で切り取ることはできません。あなたは集約でそれを行うことができますが、私はその過度のことを考えています。

あなたが最後の文書取得したい場合は:あなたの検索オプションで新しい

使用(そう、それはページ変数内の更新件のデータを返す)

{ new: true } 

をしてから返された更新されたデータをスライスあなたが必要とするものだけを得ること。 PS

Page.findByIdAndUpdate(pageId, { 
    $addToSet: { 
    comments: { 
     $each: comments 
    } 
    } 
}, { new: true }, (err, page) => { 
    // Do not forget, what happend if _id is wrong? 
    // if (!page) return ...; 
    return page.comments.slice(page.comments.length - comments.length - 1); 
}); 

を(フレッシュデータが配列の末尾にあるであろう追加):私はあなたがES6構文を使用しました。あなたのコードにPromisesを実装することをお勧めします。私はそれが読書を改善し、機能の連鎖を簡素化すると思う。

Page.findByIdAndUpdate(pageId, { 
     $addToSet: { 
     comments: { 
      $each: comments 
     } 
     } 
    }, { new: true }) 
    .then(page => page.comments.slice(page.comments.length - comments.length - 1)) 
    .then(page => ...) 
    .catch(err => ...); 
+0

ありがとう! 2番目の '.then()'は何ですか?それを追加して、複数の 'then()'をチェーン化できることを私に示しましたか?しかし、 'then()'ブロックを繰り返すことはいつ便利でしょうか? – Jamgreen

+0

すべてのコメントを取得してカウントし、1つの要素をスライスするのは非常に遅いのですか? – Jamgreen

+0

ええ、2番目の 'それはあなたが他のものをすることができる場所です。長い場合(文書内の多くのデータ)、集計を行います。しかし、99%の時間では、ドキュメント内のネストされた配列内に大量のデータを格納することはありません。 –