8

私は、mongoデータベースとWebアプリの間でデータを交換するためにRESTAPIを実行しています。これらのデータはjson形式です。

ドキュメントの更新に関して問題があります。

cannot change _id of a document.

実際のところ、私のJSONでは、ドキュメントの_idは文字列として保存され、文字列として逆シリアル化されます。一方、mongoではObjectIDとして保存されます。これは、mongoがエラーを発生させる理由を説明しています。

  • mongoの場合:_id:ObjectId( '51051fd25b442a5849000001')
  • JSONの場合:_id: "51051fd25b442a5849000001"

これを回避するために、_idプロパティを文字列からObjectIDに手動で変換します。しかし、それは醜いようで、他のBSONタイプでは失敗します。

Q:それを回避したり、JSON / BSON変換をうまく実行したりするためのクリーンな方法はありますか?

以下は、ドキュメントを更新するために使用するコードです。私はexpressでnodejsを使用し、ネイティブドライバーでmongodbを使用しています。

exports.updateById = function(req, res) {
var id = req.params.id;
var map = req.body;

map._id = new ObjectID.createFromHexString( map._id); // Manual conversion. How to avoid this???

console.log( 'Updating map: ' + id);
console.log( 'Map: ' + JSON.stringify( map));

db.collection('maps', function(err, collection) {
    if(err) throw err;
    collection.update(
        {'_id': new BSON.ObjectID(id)}, map, {safe:true}, 
        function(err, result) {
            if (err) {
                console.log('Updating map err: ' + JSON.stringify( err));
                res.json( 500, {'message':'An error has occurred while updating the map', 'error': err});
            } else {
                console.log('Updating succeed');
                res.send(map);
            }
        }
    );
});

};

4

1 に答える 1

11

フィールドを変更することはできないため、ObjectId に変換するのではなく、オブジェクト_idからそのフィールドを単純に削除することをお勧めします。map

したがって、この:

delete map._id;

これの代わりに:

map._id = new ObjectID.createFromHexString( map._id);

で試みているように更新されたオブジェクトを返したい場合は、投稿されたものだけでなく、結果のドキュメントにアクセスできるように、代わりに をres.send(map);使用する必要があります。findAndModifyupdate

于 2013-01-29T14:50:16.177 に答える