为什么 mongodb node.js 驱动程序的 insertOne 方法会改变要插入的对象?

seg*_*ter 6 javascript mongodb node.js

我正在用 node 学习 mongodb,我在玩下面的代码

var assert = require('assert')
var url = 'mongodb://localhost:27017/learnyoumongo'
var client = require('mongodb').MongoClient

var doc = {
  firstName: 'Steve',
  lastName: 'Smith'
}
console.log(doc)  //logs as expected
client.connect(url, (err, db) => {
  assert.equal(err, null)
  var docs = db.collection('docs')
  docs.insertOne(doc, (err, result) => {
    assert.equal(err, null)
    console.log(doc)  //logs with an extra property i.e. _id
    db.close()
  })
})
Run Code Online (Sandbox Code Playgroud)

我很惊讶地看到它doc被 mongo 改变了,看看检查这两个console.log语句的输出。为什么doc对象发生了变异。

pie*_*key 3

Mongo 会为每个本身未定义的文档添加一个自动生成的 _id。这是一种称为 ObjectId 的特殊对象类型,用作主键。您可以在此处查看格式的详细信息。

您可以通过向每个对象添加自己的 _id 来绕过自动生成的 _id,但您需要能够保证它们是唯一的,就像您尝试存储具有相同 _id 的两个对象一样,您将获得重复的键错误。