2016-12-19 11 views
0

mongo DBラッパーにtest(spec)を書き込もうとしていて、この奇妙な問題に遭遇しました。ObjectIdでMongoDB Node.js deleteOneがObjectIdで動作しない

mongodbの薄いラッパーの上に構築し、_idを文字列として世界に公開しますが、mongoと話すときにObjectIdに使用(変換)してください。

私は備品を作成するヘルパーをしました:

var _ = require('lodash'), 
    Promise = require('bluebird'), 
    MongoDb = require('mongodb'); 

var fixtureData = [ 
    { 
     'uuid': '1', 
     'owner': 'A', 
     'data': 'someData1' 
    }, 
    { 
     'uuid': '2', 
     'owner': 'A', 
     'data': 'someData2' 
    }, 
    { 
     'uuid': '3', 
     'owner': 'B', 
     'data': 'someData3' 
    }, 
    { 
     'uuid': '4', 
     'owner': 'A', 
     'data': 'someData4' 
    }, 
    { 
     'uuid': '5', 
     'owner': 'A', 
     'data': 'someData5' 
    }, 
    { 
     'uuid': '6', 
     'owner': 'B', 
     'data': 'someData6' 
    } 
] 

module.exports.loadFixtures = function (url, collectionName) { 
    var MongoClient = MongoDb.MongoClient; 

    return MongoClient.connect(url, { 
     promiseLibrary: Promise 
    }).then(function (db) { 
     return db.dropCollection(collectionName) 
      .catch(function (err) { 
       if (err.message === 'ns not found') { 
        return 'does not exist'; 
       } 
       throw err; 
      }) 
      .then(function() { 
       return db.collection(collectionName).insertMany(fixtureData); 
      }).then(function (result) { 
       _.forEach(result.insertedIds, function (value, idx) { 
        fixtureData[idx]._id = value; 
       }); 
       return db; 
      }); 
    }).then(function (db) { 
     db.close(); 
     return fixtureData; 
    }); 
}; 

私がテストするためにジャスミンを使用して、私はいつもまったく同じ状況で各テストを開始するには、すべてのbeforeEachでこれを呼び出します。

私はその後、削除をテストする機能を持っている(simplyfing):私のdeleteDocumentインサイド

var dataToDelete = fixtureData[0]; 
sut.deleteDocument(dataToDelete_.id) 
    .then(function(result) { 
     expect(....); 
    }); 

私は特別なことは何も行いません。

db.collection('myCollection').deleteOne({ _id: theId }) 
    then(function(result)) { 
     if (result.deletedCount === 0) { 
      throw new Error('No document to delete with ID: ' + _id); 
     } 
     return null; 
    }); 

ここtheId変数はモンゴObjectIdに変換得られるがIDは非常に単純な関数でパラメータとして渡されます:

function (id) { 
    if (_.isString(id)) { 
     return MongoDb.ObjectId(id); 
    } 
    if (MongoDb.ObjectId.isValid(id) === true) { 
     return id; 
    } 
    throw new Error('Invalid ObjectId'); 
}; 

私はmongodb Node.jsドライバのバージョン2.2.16を使用しています。

ObjectId_idとすると、私はいつもdeletedCount = 0を受け取りますが、それをStringに変換すれば機能し、機能が削除されます。

私が見つけたすべてのドキュメントとすべての例で常に_idObjectIdと言っているので、これは完全に困惑します。

誰かが何が起こっているのか説明できますか?

EDIT :(正しい答えが私に届きましたが、これはあなたがこのような状況になった場合に探している実際のアンカーです)この状況になると、作成時に_idフィールドに文字列を渡していますドキュメント。なぜそれが意図されておらず、修正しようとしているのかを確認してください

答えて

1

異なるテストの間にあなたのフィクスチャがマングルされていませんか?

ところでない

return MongoDb.ObjectId(id); 

return new MongoDb.ObjectId(id); 

すべきですか?

+0

本当に問題が問題でした。フィクスチャをテストに移動し、foreachで再作成すると問題が解決しました。多くのテストでは、フィクスチャオブジェクト '_id'をテストする前に文字列に変更し、次のテキストはロードされたフィクスチャに' _id'を文字列として持っていました。 新しいことは良い点です。ありがとうございます。 –

関連する問題