我有一個相當有趣的問題,使用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值。
再次感謝!
回調函數的'updated'參數是被修改的記錄數,所以'1'在那裏有意義。嘗試記錄您使用的'userId'值,因爲代碼看起來很好。 – JohnnyHK
我確實在發佈之前檢查了userId變量,它是正確的。如果這只是我的一些骨頭錯字,我很喜歡。 :-) – lysdexia
看來我的護照策略正在通過oauth中的數據返回拒絕嘗試在db中創建新用戶的ObjectID。所以,代碼很好,我的數據是垃圾。 – lysdexia