当前位置: 首页 > 知识库问答 >
问题:

节点。js MongoDB:插入一个并返回新插入的文档

梁骞仕
2023-03-14

我想知道是否有一种方法可以插入新文档并一次返回

这是我目前使用的:

db.collection('mycollection').insertOne(options, function (error, response) {
    ...
});

共有3个答案

袁帅
2023-03-14

对于使用MongoDB驱动程序4的用户。x我找到了findOneAndUpdate的解决方法:

      const toInsert = {
        _id: mongo.ObjectId(),
        someField: 'hello',
        someOtherField: 'world'
      };
      const options = { upsert: true, returnDocument: 'after' };
      const { value: document } = await db.collection.findOneAndUpdate(
        toInsert,
        { $set: {} },
        options
      );

请注意,toInsert中的\u id是新生成的ObjectId

更新是空的({$set:{}}),并且不做任何操作,因为我们不需要更新,我们只想升级我们的文档。仍然需要它,因为更新不能是null或空对象。

由于使用了返回文档选项,新创建的文档将作为结果中的值返回。

为了避免空更新,另一个解决方案是使用$setOnInrett

      const toInsert = { someField: 'hello', someOtherField: 'world' };
      const options = { upsert: true, returnDocument: 'after' };
      const { value: document } = await db.collection.findOneAndUpdate(
        { _id: mongo.ObjectId() },
        { $setOnInsert: toInsert },
        options
      );
长孙阳焱
2023-03-14

以下代码在MongoDB版本2.2.33中对我有效。

db.collection("sample_collection").insertOne({
   field1: "abcde"
}, (err, result) => {
   if(err) console.log(err);
   else console.log(result.ops[0].field1)
}
魏旭
2023-03-14

更新2021:此方法不再适用于MongoDB驱动程序4. x。插入器的返回结果只包含一个ID和确认标志:https://mongodb.github.io/node-mongodb-native/4.1/interfaces/InsertOneResult.html

有了这一变化,就无法实现所需的行为。您应该执行另一个DB请求,或者合并返回的insertId和原始对象数据。

响应结果包含有关命令是否成功以及插入的记录数的信息。

如果要返回插入的数据,可以尝试response.ops,例如:

db.collection('mycollection').insertOne(doc, function (error, response) {
    if(error) {
        console.log('Error occurred while inserting');
       // return 
    } else {
       console.log('inserted record', response.ops[0]);
      // return 
    }
});

官方留档为插入一个

http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#insertOne

回调类型:

http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#~insertOneWriteOpCallback

结果类型:

http://mongodb.github.io/node-mongodb-native/3.1/api/Collection.html#~insertOneWriteOpResult

 类似资料:
  •        点击后即可选中要素,然后通过点击需要插入节点的位置即可插入节点,并且可以通过拖拽形式对已插入的节点进行移动。

  • 好的,这个问题不是关于如何返回ID,而是更像是如何跳过它...我有一种情况,我使用last_insert_id()获取最后插入的行的id,但如果没有插入行,我希望得到一个零。问题如下: I INSERT...UPDATE一些记录:由于行是新插入的,因此返回所有ID 然后重复这个过程:这一次不返回ID。耶!这正是我想要的 我更改了一个列值并重复该过程:但现在返回了我更改了列值的行的ID。这让我很生气

  • 问题内容: 我有个问题。有三个表:T1,T2,T_target。T1和T2表具有许多不同的列,但我只需要两者中的ID列。T_target表具有一个ID列,当然还有另一个:project_No。 T1和T2中也出现了一些ID,但是我不想在它们之间创建重复项,如果一个ID同时出现在两个表中,则只需将其插入到T_target中一次,但是如果它已经在T_target中,则允许行动两次。另一个条件是,每个新

  • 我在做一个程序,没有使用Java的内置链表类;我在从头开始做。除了编写一个将节点插入链表的特定位置的方法外,我在所有方面都取得了成功。 我有一个方法将一个特定的节点设置为“当前”节点。所以,例如,我有一个链表,看起来是这样的:猫-->狗-->使-->好-->宠物,“当前”等于2;这意味着“当前”节点是“狗”。 从这里开始,假设我想在“current”的位置插入一个新节点,它的info字段为AND。

  • 我需要向MongoDB插入一个文档并返回新插入的文档。我用了db。集合(“集合名称”)。insertOne(“要插入的数据”)。然后((res)= 错误:未定义ops。 insertOne只返回插入文档的_id,而不是整个文档☹ 但早些时候,它通常返回整个文档。我使用了mongoclient而不是mongoose,在mongoose中它返回整个文档,但我不喜欢使用mongoose。

  • 问题内容: 这是场景: 我正在尝试在插入表时创建引用记录。但是我得到的是null,因为它是自动从序列中生成的。我也尝试了触发器插入,但是结果是一样的。有什么办法解决吗? 问题答案: 避免使用规则,因为它们会再次咬住您。 在每行运行的表a上使用after触发器。它看起来应该像这样(未经测试):