3

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 が配列に表示されます。

再度、感謝します!

4

1 に答える 1

1

私のパスポート戦略は、oauth からのデータを介して、データベースで拒否された新しいユーザーの作成の試みの ObjectID を返しているようです。だから、コードは問題ありません、私のデータはゴミです。

何も信用せず、おっぱいのように見えるように準備してください。:-)

私の戻り値 JohnnyHK を明確にしていただきありがとうございます。

于 2013-06-28T18:31:59.730 に答える