2013-06-28 82 views
3

我有一個相當有趣的問題,使用mongoDB的$ addToSet到一個完整的ObjectIds數組。Mongoose:使用addToSet和ObjectIds結果孤兒ID

在我的貓鼬模式(「Happening」)中,我聲明瞭一個名爲「expected」的ObjecIds數組,用於.populate()。

expected: [{type: Schema.Types.ObjectId, ref: "User" }] 

......它在我無處不在的地方使用它。到現在爲止還挺好。

然後我嘗試所概述這裏更新使用$ addToSet的Happening.expected陣列:

http://docs.mongodb.org/manual/reference/operator/addToSet/ 

像這樣:

app.get("/happening/yamobethere/:id", ensureLoggedIn("/login"), 
    function (req, res) { 

    // userId is the mongo ObjectId of the user record 
    var userId = req.session.user.id, 
     eventId = req.params.id; 

    models.Happening.update(
     {_id: eventId}, { 
      $addToSet: {expected: userId} 
     }, 
     function(err, updated){ 
      if (err) { 
       res.json({"error": err}); 
      } 
      res.json({"updated": updated}); 
    }); 
}); 

...它總是產生:

{updated: 1} 

現在文檔引導我期待我傳入的實際userId,所以「1」有點奇怪。我預計它會失敗,鑑於接下來會發生的奇怪現象,這似乎是某種類型的mongodb錯誤,它滲透到了我作爲結果的方式。

的怪事是,當我檢查我的數據庫,我看到的確是一個新的ObjectId已添加:只是沒有我在通過一個

"expected" : [ 
     ObjectId("51cb18623ade2b9f1e000004"), 
     ObjectId("51cdb7c12f0e58bdb3000001") 
    ], 

成爲

"expected" : [ 
     ObjectId("51cb18623ade2b9f1e000004"), 
     ObjectId("51cdb7c12f0e58bdb3000001"), 
     ObjectId("51cdb80e09612bfab3000002") 
    ], 

新ObjectId不會出現在我的任何集合中。它似乎是一個孤兒,但我是一個孟戈諾伯,所以我可能會充滿堆肥。

我確實嘗試施放的userid一個的ObjectId:

$addToSet: {expected: mongoose.Types.ObjectId.fromString(userId)} 

但什麼都沒有改變,真是不應該是必要的,因爲該模式應當予以受理。

我真的寧願不求助於下載整個對象,將值附加到「預期」數組,然後將整個schmear發送回更新。

任何幫助表示讚賞,夥計們。謝謝!

更新:

一位同事提出了以下技術:

var addMe = {$addToSet: {expected: userId}}; 

    models.Happening.findByIdAndUpdate(eventId, addMe, function(err, me) { 
     if (err) { 
      return json(err); 
     } 
     res.json(200, me); 
    }); 

...這是一個有點改善,因爲它實際上返回一個對象爲我檢查。不幸的是,它還會導致出現在數組中的孤兒ObjecIds,而不是我指定的現有userId值。

再次感謝!

+0

回調函數的'updated'參數是被修改的記錄數,所以'1'在那裏有意義。嘗試記錄您使用的'userId'值,因爲代碼看起來很好。 – JohnnyHK

+0

我確實在發佈之前檢查了userId變量,它是正確的。如果這只是我的一些骨頭錯字,我很喜歡。 :-) – lysdexia

+0

看來我的護照策略正在通過oauth中的數據返回拒絕嘗試在db中創建新用戶的ObjectID。所以,代碼很好,我的數據是垃圾。 – lysdexia

回答

0

看來我的護照策略正在通過oauth中的數據返回被拒絕嘗試在db中創建新用戶的ObjectID。所以,代碼很好,我的數據是垃圾。

永遠不要相信任何東西,並且準備好看起來像胸部。:-)

感謝您對我的返回值JohnnyHK的澄清。