2016-07-14 41 views
1

我試圖用幾種方式來實現這一點,而且都沒有效果。 我需要做的是將特定Notifications對象(由其_id找到)的Status值從0更改爲1爲什麼我的Mongoose查詢不更新MongoDB數據庫中嵌套數組中的值?

例JSON:

{ 
    "_id": "577fbf0c7c6e88600ede5e73", 
    "updatedAt": "2016-07-14T11:27:18.670Z", 
    "createdAt": "2016-07-08T14:56:12.013Z", 
    "Name": "Name", 
    "Email": "[email protected]", 
    "Notifications": [ 
     { 
     "_id": "5787644108edec801e9cd0ab", 
     "Title": "They commented on This", 
     "Type": 1, 
     "Status": 0, 
     "TeamID": "578357109bb105602b1cba27", 
     "DraftID": "578357b89bb105602b1cba2a" 
     }, 
     { 
     "_id": "578777167d1f3424251c361f", 
     "Title": "He commented on That", 
     "Type": 1, 
     "Status": 0, 
     "TeamID": "578357109bb105602b1cba27", 
     "DraftID": "578357b89bb105602b1cba2a" 
     } 
    ] 
    ..... 
    } 

我的路線:

router.post('/notification', function (req, res) { 
    UserProfile.update({ 
     'Notifications._id' : req.body.NotificationID 
    }, { 
     '$set' : { 
      'Notifications.$.Status' : 1 
     } 
    }, function (err) { 
     if (err) 
      res.send(err); 
    }) 
}); 

我沒有得到任何錯誤和更新似乎並沒有發生。 問題是什麼?

回答

2

Notifications._id的ObjectId類型?如果是這樣,請嘗試將req.body.NotificationId投射到ObjectId。將查詢更改爲

{'Notifications._id' : mongoose.Types.ObjectId(req.body.NotificationID)} 
+0

是的,這工作!非常感謝你。你有解釋這個參考鏈接嗎?我是新來的,所以我想看看它 – Poot87

+0

你仍然會始終更新第一個通知 –

+0

@ Poot87好!在mongodb和mongoose中,「ObjectId」類型與「String」類型不同。你可以在[http://mongoosejs.com/docs/api.html#schema_Schema.Types](http://mongoosejs.com/docs/api.html#schema_Schema.Types)檢查貓鼬的類型。 – wikrsh

0

嘗試'$ set'而不是$ set。 確保你得到正確的身份證。 更新回調附帶更新的文檔 - 打印知道發生了什麼。

+0

您的意思是? '{ok:1,nModified:0,n:0}' – Poot87

+0

在設置後添加{'$ new':true}作爲參數 - 檢查更新的文檔 – npr

0

$指的只是數組中的第一項。如果要更新所有你必須使用查找和保存:

UserProfile.findOne({ 
     'Notifications._id' : req.body.NotificationID 
    }, function(err, doc) { 
     _.find(doc.Notifications, {_id: req.body.NotificationID}).Status = 1; 

     doc.save(function (err) { 
     if (err) 
      res.send(err); 
    }) 
}) 
+0

它只是用來更新一個由它的_id屬性引用的特定通知對象。 – Poot87

+0

好的,但它不會工作,因爲你工作在整個文檔。我會修復我的答案 –

+0

謝謝你的回答。它拋出這個錯誤:'ReferenceError:_沒有定義' – Poot87