2017-05-11 134 views
0

我試圖用express和mongoose構建一個簡單的任務隊列。這個想法是獲得一個客戶端,並返回活動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:

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」 - 這次它按預期運行。但是當我第二次運行相同的查詢時,我獲得了完全相同的對象,但我期望得到一個ID爲「591493d95d48e2738b0d4318」的ID。

+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是可以的 - 問題主要在於獲取正確的子文檔。不幸的是,客戶端$ ._ id產生相同的結果:空對象數組。 – foverzar