2016-05-02 20 views
1

を取得し、ネストされたドキュメント内の要素を追加します。はその後、私は、次のコレクションの定義を持っている_id

私はexpectectedとしてそれが動作

this.findOneAndUpdate({ 
    _id: data.idLocationStructure, 
    'params._id': data.idLocationStructureParameter }, 
{ $push: { 'params.$.values': { $each: dataToPush } } }, 
{ new: true }) 

特定のパラメータにいくつかの値を追加し、次の要求を持っています。

私が今したいのは、プッシュされた要素の_idを取得することですが、パラメータのすべての値をロードすることはありません。

私はfindOneAndUpdateの selectオプションを使用しようとしましたが、それは投影を使用して動作しません

this.findOneAndUpdate({ 
    _id: data.idLocationStructure, 
    'params._id': data.idLocationStructureParameter }, 
{ $push: { 'params.$.values': { $each: dataToPush } } }, 
{ new: true, select: { 'params.$.values': 1 } }) 

それは私を取得します。

{ 
    "_id": "57273904135f829c3b0739dd", 
    "params": [ 
    {}, 
    {}, 
    {}, 
    {} 
    ] 
} 

私は第2の要求を実行しようとしています_idsも取得できますが、どちらも機能しません。

this.find({ 
    _id: data.idLocationStructure, 
    'params._id': data.idLocationStructureParameter, 
}, { _id: 1, 'params.$.values': { $slice: -nbAdded } }) 

パラメータのすべての値をロードせずにプッシュされた値の_idをどのようにretievingするかというアイデアは非常に歓迎します:)

答えて

0

ウェブ上のたくさんの調査の後、スタックオーバーフロー< 3解決策が見つかりました。 :

this.aggregate([{ 
     $match: { 
      _id: new mongoose.Types.ObjectId(data.idLocationStructure), 
     }, 
    }, 
    { $unwind: '$params' }, { 
     $match: { 
      'params._id': new mongoose.Types.ObjectId(data.idLocationStructureParameter), 
     }, 
    }, 
    { $unwind: '$params.values' }, 
    { $sort: { 'params.values._id': -1 } }, 
    { $limit: nbAdded }, 
    { $project: { _id: '$params.values._id' } }, 
])) 

あなたは同じ問題が発生した場合、ここで、について説明です:

- > $のアンワインド私に行くことになります。 - > $の試合は私が

が良い、高レベルの文書を取ってますdoのparams配列cument我々は$試合

- > $のアンワインド私は値を配列に

を行くことになります - - >私は、ソート_idのDESCにより、すべての値

を$> $の試合は私が

が良いパラメータを取ってます私はprevisoulsy

を追加した値の数に> I $リミット - -

>私は(別名のような)_idの名前を変更する

だから私は、結果Aとして得ましたn最後に追加された値を含む配列_ids

関連する問題