ObjectId でいっぱいの配列に mongoDB の $addToSet を使用すると、かなり興味深い問題が発生します。
私のマングース スキーマ ("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);
});
...実際に検査するオブジェクトを返すため、これは少し改善されています。残念ながら、指定した既存の userId 値ではなく、孤立した ObjecId が配列に表示されます。
再度、感謝します!