【发布时间】:2018-11-27 02:56:24
【问题描述】:
我目前正在尝试使用 MongoDB 学习 NodeJS。我正在使用 mongoose 连接到本地安装的 MongoDB 版本,并在我的 TTD 中使用 mocha。
我知道这种情况的解决方案,但不知道为什么会这样。
让我解释一下:
我创建了一个模式和一个名为MarioCharacter 的模型。
我使用猫鼬的.save 函数将这个MarioCharacter 保存到MongoDB。
我想使用它的id在数据库中找到这个MarioCharacter(只有一个,它的变量是“newCharacter”)。
我的 mongoose 和 mocha 代码如下所示:
//Find a record by its ID
it("Finds a record by id from the database", function(done) {
MarioCharacter.findOne({_id: newCharacter._id}).then(function(result) {
//Log the value
console.log(newCharacter._id); // returns 5b277477fd8f6f2c6437e5bc
console.log(result._id); // returns 5b277477fd8f6f2c6437e5bc
//Log the type
console.log(typeof newCharacter._id); // returns object
console.log(typeof result._id); // returns object
//Test fails - returns false
assert(result._id === newCharacter._id);
done();
})
});
解决方案是使用.toString() 方法将两者都转换为字符串,这意味着这两种类型似乎并不相同,即使它们都表示对象也很难。
什么是我没有到达这里?是否还有对象的子类型或什么?
【问题讨论】:
-
因为你在比较对象。它是 javascript,与 mongo 无关。
console.log({a:1} === {a:1})输出 false 因为这些是 2 个不同的对象。 -
您可以从Object comparison in JavaScript 阅读更多内容以获得更好的想法。
-
如果你真的想比较
_id的两个BSON类型,你可以做assert.ok(result._id.equals(newCharacter._id)),基于Node.js MongoDB native driver。你也可以去查看 Node.js MongoDB 原生驱动的源代码,你会发现即使你使用equals()方法,在底层,它仍然在为你做id1.toString() === id2.toString()。 -
也就是说,这是因为两个对象都引用了不同的对象,即使它们具有相同的值?
标签: node.js mongodb mongoose mocha.js