2017-05-11 19 views
0

私はエクスプレスとモンゴーズで簡単なタスクキューを構築しようとしています。アイデアは、単一のクライアントを取得し、キャンペーンIDとクライアントID(キャンペーンのサブ文書です)を返します。たびに誰かがクライアントを取得し、そのステータスコードは1に設定されて、私は次のクエリを作ってみた:

router.post('/lease', (err, res) => { 
    Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      new: true, 
      projection: { 
       'clients.$': true, 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 
}); 

しかし、私はこのエンドポイントに接続した後に取得していますすべてがこれです:

{"_id":"591483241a84946a79626aef","clients":[{},{}]} 

問題は$投影ですが、これを修正する方法はわかりません。

編集:私は$ elemMatchを利用し、次のコードを使用してみました: - ない更新された具体的には、1つの

router.post('/lease', (err, res) => { 
    Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      new: true, 
      projection: { 
       clients: { 
        '$elemMatch': {contact_status_code: 1}, 
       } 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 
}); 

残念ながら、それぞれの要求が基準に適合し、コレクション内の最初のサブドキュメントを、生み出します。次に例を示します。

言って、私はモンゴで、次の書類を持っている:

{ 
    "_id" : ObjectId("591493d95d48e2738b0d4317"), 
    "name" : "asd", 
    "template" : "{{displayname}}", 
    "isEnabled" : true, 
    "clients" : [ 
      { 
        "displayname" : "test", 
        "_id" : ObjectId("591493d95d48e2738b0d4319"), 
        "contact_status_code" : 0 
      }, 
      { 
        "displayname" : "client", 
        "_id" : ObjectId("591493d95d48e2738b0d4318"), 
        "contact_status_code" : 0 
      } 
    ], 
    "__v" : 0 

}

私が最初にクエリを実行し、次の結果を得る:

{"_id":"591493d95d48e2738b0d4317","clients":[{"displayname":"test","_id":"591493d95d48e2738b0d4319","contact_status_code":1}]} 

クライアントID「591493d95d48e2738b0d4319」を通知します - 今回は、期待どおりに実行されます。しかし、同じクエリを2回目に実行すると、同じオブジェクトが得られますが、idが "591493d95d48e2738b0d4318"のものが得られます。

+0

埋め込み型アレイでの更新後に新しい値を取り戻すにはどうすればいいですか?](http://stackoverflow.com/questions/35946989/how-to-get-back-the-new-value-更新後の組み込み配列) – Veeram

+0

@Veeram答えは、$ elemMatchを使用して_idでクエリすることを示しています。残念ながら、私は_idをあらかじめ知りません:\ – foverzar

+0

それはその投稿の答えです。 elemmatchの独自の基準を使用するように更新することができます。 'のようなもの{:{ "クライアント": "投影"{ "$ elemMatch":{ "contact_status_code":1} } } }' – Veeram

答えて

0

問題はここnew: true

とあったが、実施例である:

Campaign.findOneAndUpdate({'isEnabled': true, 'clients.contact_status_code': 0}, { 
      '$set': { 'clients.$.contact_status_code': 1 }, 
     }, 
     { 
      //new: true <-- this was causing the trouble 
      projection: { 
       clients: { 
        '$elemMatch': {contact_status_code: 0}, // 0 because the old record gets matched 
       }, 
      }, 
     }, 
     (err, campaign) => { 
      if (err) { 
       return res.send(err); 
      } 

      res.json(campaign); 
     } 
    ); 

new:trueが設定されている場合、私は、仮定、モンゴは、一致するコンテキストを失います。このアプローチは残念ながら古いレコードを返しますが、それでもまだ_idを取得する必要があります。

+0

ようこそ。私はこれがあなたが描写しているように機能することを願っています私はこの動作のためのドキュメントを見つけることができません。必要なテストケースをすべて追加してください。 – Veeram

0

あなたにはキャンペーンIDが表示されているようですが、クライアントも欲しいです。$、あなたはクライアントを試しましたか$ ._ id?

+0

はい、キャンペーンIDは問題ありません。問題は具体的には適切なサブ文書を取得することです。残念なことに、clients。$ idは空のオブジェクトの配列と同じ結果を返します。 – foverzar

関連する問題