NodeJS의 Mongo 데이터베이스에 삽입 된 문서의 _id를 가져옵니다.


100

NodeJS를 사용하여 MongoDB에 문서를 삽입합니다. 사용하면 collection.insert다음 코드와 같이 데이터베이스에 문서를 삽입 할 수 있습니다.

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

_id삽입 된 개체를 어떻게 얻을 수 있습니까?

_id최신 개체를 삽입하지 않고 얻을 수있는 방법이 _id있습니까?

동시에 많은 사람들이 데이터베이스에 액세스한다고 가정하면 최신 ID가 삽입 된 개체의 ID인지 확신 할 수 없습니다.

답변:


88

collection.insert_id가 있어야하는 삽입 된 문서 또는 문서를 리턴하는 콜백에 대한 두 번째 매개 변수 가 있습니다.

시험:

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

콘솔에서 무슨 뜻인지 확인하십시오.


4
콜백은 실제로 삽입 된 문서의 배열을 반환합니다. 따라서 단일 문서를 삽입 한 경우 다음과 같이 삽입 된 레코드에 액세스 할 수 있습니다. collection.insert ({name : "David", title : "MongoDB 정보"}, function (err, records) {console.log ( "Record added as"+ records [0] ._ id);}); 참조 : mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
로힛 싱 Sengar

2
콜백 API가 변경되었습니다 : mongodb.github.io/node-mongodb-native/2.0/api/…
tenbits

링크는 어디 유용 이어질하지 않습니다
davidhadas을

이것이 일반적인 것인지 유성에서만 작동하는지는 모르겠지만 collection.insert (object)를 호출하면 삽입 된 객체의 ID를 즉시 반환합니다.
vantesllar

4
docsInserted는 나를 위해 _id를 반환하지 않습니다. 나에게 반환 { "ok": 1, "n": 1, "opTime": { "ts": "6361004504208375809", "t": 5}, "electionId": "7fffffff0000000000000005"}
user1709076

90

콜백에 두 번째 매개 변수를 사용하는 것보다 짧은 방법 은 (콜백 함수 내부에서 성공적인 작업이라고 가정 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
});

4
매우 통찰력있는 감사합니다. 콜백 매개 변수가 변경 되었기 때문에 다른 곳에서는이 정보를 찾을 수 없습니다.
Brad Hein 2015

@BradHein 천만에요! 아마도 MongoDB 드라이버는 객체 참조를 수정하므로 여기서도 수정됩니다. :)
Ionică Bizău

코드가 잘못되었습니다. var objectId = objectToInsert._id; 당신은 var objectId = objectInserted._id;
Andy Lorenz

3
@AndyLorenz 무엇입니까 objectInserted? 이 대답의 요점을 정확히 놓치고 있다고 생각합니다. Mongo 드라이버가 _id필드를 원래 개체에 추가 합니다. 나는 objectToInsert모든 곳 에서 사용하기 위해 대답을 편집했습니다 . 이제 상황이 더 명확 해지기를 바랍니다. :)
Ionică Bizău

1
참고 : insert()더 이상 사용되지 않습니다. 사용 insertOne()대신에
evilReiko

16

ktretyak이 말했듯이 삽입 된 문서의 ID를 얻는 가장 좋은 방법은 결과 객체에 insertId 속성을 사용하는 것입니다. 제 경우에는 result._id가 작동하지 않았으므로 다음을 사용해야했습니다.

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

콜백을 사용하는 경우도 마찬가지입니다.


13

실제로 삽입 용 콜백 함수의 두 번째 매개 변수에 대해 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()
Fadwa

7

Mongo는 전체 문서를 콜백 객체로 전송하므로 여기에서만 가져올 수 있습니다.

예를 들면

collection.save(function(err,room){
  var newRoomId = room._id;
  });

4

이제 insertOne 메서드와 promise의 결과를 사용할 수 있습니다.


코드 예제를 제공해 주시겠습니까? 이 결과 개체의 출처는 어디입니까?
JSideris

@JSideris, 사양 메소드 insertOne () 에서 볼 수 있듯이이 메소드는 세 개의 매개 변수를 허용 (doc, options, callback)합니다. 세 번째 매개 변수- 두 개의 매개 변수를 사용 하는 콜백 (error, result). 그리고 result-이것이 당신이 찾고있는 것입니다.
ktretyak

2

@JSideris, insertId를 얻기위한 샘플 코드.

db.collection(COLLECTION).insertOne(data, (err, result) => {
    if (err) 
      return err;
    else 
      return result.insertedId;
  });

2

"_id"를 사용하려면 simpley를 사용하십시오.

result.insertedId.toString() 

// toString은 16 진수에서 변환됩니다.


그게 제가 찾던 것입니다. 감사합니다.
Fadwa

언급하지 않는 다른 답변이 있기 때문에 참으로 버전 변화가 있어야합니다 result.insertedId이다 ObjectID타입의 객체입니다. .toString()이 개체를 실제 UUID로 변환합니다.
Dylan Pierce

0

비동기 함수 를 사용 하여 데이터 개체를 조작하지 않고 _id 필드를 자동으로 가져올 수 있습니다 .

async function save() {
  const data = {
    name: "John"
  }

  await db.collection('users', data )

  return data
}

데이터를 반환합니다.

{
  _id: '5dbff150b407cc129ab571ca',
  name: 'John'
}

0

비동기 함수에서 수행하는 또 다른 방법 :

const express = require('express')
const path = require('path')
const db = require(path.join(__dirname, '../database/config')).db;
const router = express.Router()

// Create.R.U.D
router.post('/new-order', async function (req, res, next) {

    // security check
    if (Object.keys(req.body).length === 0) {
        res.status(404).send({
            msg: "Error",
            code: 404
        });
        return;
    }

    try {

        // operations
        let orderNumber = await db.collection('orders').countDocuments()
        let number = orderNumber + 1
        let order = {
            number: number,
            customer: req.body.customer,
            products: req.body.products,
            totalProducts: req.body.totalProducts,
            totalCost: req.body.totalCost,
            type: req.body.type,
            time: req.body.time,
            date: req.body.date,
            timeStamp: Date.now(),

        }

        if (req.body.direction) {
            order.direction = req.body.direction
        }

        if (req.body.specialRequests) {
            order.specialRequests = req.body.specialRequests
        }

        // Here newOrder will store some informations in result of this process.
        // You can find the inserted id and some informations there too.
        
        let newOrder = await db.collection('orders').insertOne({...order})

        if (newOrder) {

            // MARK: Server response
            res.status(201).send({
                msg: `Order N°${number} created : id[${newOrder.insertedId}]`,
                code: 201
            });

        } else {

            // MARK: Server response
            res.status(404).send({
                msg: `Order N°${number} not created`,
                code: 404
            });

        }

    } catch (e) {
        print(e)
        return
    }

})

// C.Read.U.D


// C.R.Update.D


// C.R.U.Delete



module.exports = router;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.