gpt4 book ai didi

javascript - MongoDB Node.js 通过 _id 的 deleteOne 不适用于 ObjectId

转载 作者:行者123 更新时间:2023-12-03 05:24:06 26 4
gpt4 key购买 nike

我正在尝试在 mongo DB 包装器上编写测试(规范),并偶然发现了这个奇怪的问题。

我的代码,构建在 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;
});
};

我使用 jasmine 进行测试,并在每次 beforeEach 调用它,以始终以相同的确切情况开始每个测试。

然后我有一个函数来测试删除(简单地):

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

在我的deleteDocument中我没有做任何特别的事情:

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这里的变量是在 mongo 中转换得到的 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 .

这里的问题是我总是收到 deletedCount = 0如果我使用 ObjectId_id但如果我将它转换为字符串,它就会起作用并删除该函数。

这让我完全困惑,因为我找到的每个文档和每个示例总是说 _idObjectId .

谁能解释一下这是怎么回事吗?

编辑:(答案让我朝着正确的方向前进,但如果您最终处于这种情况,这就是您正在寻找的实际答案)如果您最终处于这种情况,您将在 _id 中传递字符串创建文档时的字段。如果不是有意的,请查明为什么要这样做,然后修复它

最佳答案

您确定您的装置在不同的测试之间没有损坏吗?

顺便说一下,不应该

return MongoDb.ObjectId(id);

return new MongoDb.ObjectId(id);

关于javascript - MongoDB Node.js 通过 _id 的 deleteOne 不适用于 ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41228499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com