在NodeJS中获取Mongo数据库中插入文档的_id

IT技术 javascript node.js mongodb
2021-01-31 08:06:37

我使用 NodeJS 在 MongoDB 中插入文档。使用collection.insert我可以像下面的代码一样将文档插入到数据库中:

// ...
collection.insert(objectToInsert, function(err){
   if (err) return;
   // Object inserted successfully.
   var objectId; // = ???
});
// ...

我怎样才能得到_id插入的对象?

有没有办法在_id不插入最新对象情况下获得_id

假设同时有很多人访问数据库,我不能确定最新的id是插入的对象的id。

6个回答

比使用第二个参数用于回调更短的方法collection.insert是使用objectToInsert._id返回_id(在回调函数内部,假设它是一个成功的操作)。

NodeJS 的 Mongo 驱动程序将_id字段附加到原始对象引用,因此很容易使用原始对象获取插入的 id:

collection.insert(objectToInsert, function(err){
   if (err) return;
   // Object inserted successfully.
   var objectId = objectToInsert._id; // this will return the id of object inserted
});
你的代码是错误的,你说 var objectId = objectToInsert._id; 你的意思是说 var objectId = objectInserted._id;
2021-03-19 08:06:37
注意:insert()已弃用。使用insertOne()替代
2021-03-21 08:06:37
@AndyLorenz 是什么objectInserted我想您完全错过了这个答案的重点:Mongo 驱动程序将该_id字段附加到原始对象。我编辑了答案以objectToInsert在任何地方使用希望事情现在更清楚了。:)
2021-03-24 08:06:37
@BradHein 不客气!可能 MongoDB 驱动程序修改了对象引用,所以它也在这里被修改。:)
2021-03-25 08:06:37
非常有见地谢谢。由于回调参数发生变化,无法在其他任何地方找到此信息。
2021-03-27 08:06:37

回调的第二个参数collection.insert将返回插入的文档或文档,其中应该有 _ids。

尝试:

collection.insert(objectToInsert, function(err,docsInserted){
    console.log(docsInserted);
});

并检查控制台以了解我的意思。

回调实际上返回插入的文档数组。因此,如果您插入了单个文档,则可以按如下方式访问插入的记录。collection.insert({name:"David", title:"About MongoDB"}, function(err, records){ console.log("Record 添加为"+records[0]._id); }); 参考:mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
2021-03-20 08:06:37
链接不会导致任何有用的地方
2021-03-25 08:06:37
docsInserted 不会为我返回 _id。它为我返回 { "ok": 1, "n": 1, "opTime": { "ts": "6361004504208375809", "t": 5 }, "electionId": "7fffffff0000000000000005" }
2021-03-30 08:06:37
我不知道这是通用的还是仅适用于流星,但是当您调用 collection.insert(object) 时,它会立即返回插入对象的 id。
2021-04-11 08:06:37
2021-04-12 08:06:37

正如 ktretyak 所说,获取插入文档的 ID 的最佳方法是在结果对象上使用 insertId 属性。在我的情况下 result._id 不起作用,所以我不得不使用以下内容:

db.collection("collection-name")
  .insertOne(document)
  .then(result => {
    console.log(result.insertedId);
  })
  .catch(err => {
    // handle error
  });

如果你使用回调也是一样的。

我实际上为插入的回调函数中的第二个参数做了一个 console.log() 。除了插入的对象本身,实际上还有很多返回的信息。所以下面的代码解释了如何访问它的 id。

collection.insert(objToInsert, function (err, result){
    if(err)console.log(err);
    else {
        console.log(result["ops"][0]["_id"]);
        // The above statement will output the id of the 
        // inserted object
       }
});
这会输出一个ObjectID {_bsontype: "ObjectID", id: Buffer(12)}. 我如何使用它来获取数据库中的实际 ID?...在​​另一条评论中找到答案:使用result.insertedId.toString()
2021-03-25 08:06:37

如果您想使用“_id”,请使用 simpley

result.insertedId.toString() 

// toString 将从十六进制转换

是的,肯定有版本更改,因为其他答案没有提到result.insertedIdObjectID类型对象。.toString()将把这个对象转换成一个真正的 UUID。
2021-03-15 08:06:37
这就是我要找的。谢谢你。
2021-03-27 08:06:37