IT

Node.js + MongoDB: 하나를 삽입하고 새로 삽입한 문서를 반환합니다.

itgroup 2023. 5. 8. 22:07
반응형

Node.js + MongoDB: 하나를 삽입하고 새로 삽입한 문서를 반환합니다.

새로운 문서를 삽입하여 한 번에 반송할 수 있는 방법이 있는지 궁금합니다.

현재 사용 중인 기능은 다음과 같습니다.

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

업데이트 2021:접근 방식은 더 이상 MongoDB 드라이버 4.x에서 작동하지 않습니다.insertOne의 반환 결과에는 ID 및 확인 플래그만 포함됩니다. https://mongodb.github.io/node-mongodb-native/4.1/interfaces/InsertOneResult.html

이러한 변경으로 인해 필요한 동작을 수행할 방법이 없습니다.다른 DB 요청을 수행하거나 반환된 insertId와 원래 객체 데이터를 결합해야 합니다.


responseresult에는 명령의 성공 여부와 삽입된 레코드 수에 대한 정보가 포함되어 있습니다.

삽입된 데이터를 반환하려면 다음을 시도할 수 있습니다.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 
    }
});

공식 문서:insertOne:

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

callback유형:

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

result유형:

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

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
      );

주목할 것은_idtoInsert새로 생성된 항목입니다.ObjectId.

업데이트가 비어 있습니다({ $set: {} }업데이트할 필요가 없기 때문에 아무것도 하지 않습니다. 문서를 뒤집기만 하면 됩니다.업데이트가 불가능하기 때문에 여전히 필요합니다.null또는 빈 개체입니다.

때문에returnDocument새로 만든 문서가 결과에 값으로 반환됩니다.


빈 업데이트를 방지하기 위한 또 다른 해결책은 다음과 같습니다.$setOnInsert:

      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
      );

다음 코드는 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)
}

몽구스를 사용하면 됩니다.와 함께save문서를 삽입하고 성공 시 반환할 수 있는 방법입니다.다음은 몽구스 설명서의 예입니다.

product.save(function (err, product, numAffected) {
  if (err) {
    // Handle error...
  } else {
    // Do something with the returned document...
  }
})

이렇게 게시하는 것이 누군가에게 도움이 될 수 있습니다.다음과 같이 업데이트된 개체를 찾을 수 있습니다.

await req.db
    .collection('users')
    .insertOne({ email, password: hashedPassword, name  })
    .then(({ ops }) => ops[0]);

mongojs를 사용하면 됩니다.

db.collection('mycollection').save(doc, function(error, response){
  // response has _id
})

사용해 보십시오.

try {
    let collection = db.collection('collection_name'); let { ops: inserted } = 
    await collection.insertOne({ data: object });
    // can access array of inserted record like :
    console.log(inserted)
 } catch (error) {
    // log errors
 }

업데이트 2021:이 접근 방식은 더 이상 MongoDB 드라이버 4.x에서 작동하지 않습니다.insertOne의 반환에는 ID 및 확인 플래그만 포함됩니다.

저는 여전히 .then()을 사용하여 삽입으로 해결하고 싶었기 때문에 결국 모든 것을 그것 자체의 약속으로 마무리했습니다.

 return new Promise((resolve, reject) => {
     db.collection('entries').insertOne({ entry }, (err, res) => {
     if (err) {
       console.log('error', err);
       reject(null);
     } else {
       resolve(res.ops[0]);
     }
   });
 });

그럼 난 그냥 할 수 있어요.

 insertEntry({}).then(entry=>{})

최신 v4 동작

로렌이 공식 mongodb 포럼에서 말했듯이, 이것은 예상되는 행동입니다.그녀의 대답을 여기에 복사합니다.

드라이버가 MongoDB CRUD 사양을 준수하는 것은 드라이버 v4의 새로운 기능입니다.

이 신이당 때.insertOne이제 알 것입니다.insertedId따라서 데이터베이스에서 처리되는 문서의 "새" 부분만 제공해야 합니다.

    const myDoc = { a: 1 }
    myDoc._id = (await c.insertOne(myDoc)).insertedId
    // myDoc is now the same as the doc inserted into mongodb 

ID로 삽입한 문서를 반환할 수 있습니다.

async insertProduct(product) {
  const record = await db.collection("products").insertOne(product);
  return {id: record.insertedId, ...product }
}

언급URL : https://stackoverflow.com/questions/40766654/node-js-mongodb-insert-one-and-return-the-newly-inserted-document

반응형