模式._id与.fid()返回的._id不一样? [的NodeJS /猫鼬]

时间:2018-06-18 09:33:44

标签: node.js mongodb mongoose mocha

我目前正在尝试使用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()方法将两者转换为字符串,这意味着两种类型看起来都不一样,甚至很难说它们都是对象。

我不能来这里的是什么?还有对象的子类型还是什么?

1 个答案:

答案 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字节的计数器,以随机值开始。
  •   

- Introduction to MongoDB > BSON types