我目前正在尝试使用MongoDB学习NodeJS。我使用mongoose连接到本地安装的MongoDB版本,并使用mocha作为我的TTD。
我知道这种情况的解决方案,但不知道为什么会这样。
让我解释一下:
我创建了一个名为MarioCharacter
的模式和模型。
我使用mongoose的MarioCharacter
函数将此.save
保存到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()
方法将两者转换为字符串,这意味着两种类型看起来都不一样,甚至很难说它们都是对象。
我不能来这里的是什么?还有对象的子类型还是什么?
答案 0 :(得分:0)
您从// Log the value
部分看到的实际上是因为Node.js MongoDB本机驱动程序具有重写方法toString()
,因此当您执行console.log()
时,它将打印toString()
1}}结果在您的控制台上。
请参阅此MDN post,了解Object.prototype.toString()
和Node.js MongoDB native driver source code(第189-197行)。
最初,MongoDB的ObjectId是这样的:
ObjectIds很小,可能很独特,生成和排序快。 ObjectId值由12个字节组成,其中前四个字节是反映ObjectId创建的时间戳。具体做法是:
- 一个4字节的值,表示自Unix纪元以来的秒数,
- 一个3字节的机器标识符,
- 一个2字节的进程ID,
- 一个3字节的计数器,以随机值开始。