Dapatkan _id dari dokumen yang disisipkan dalam database Mongo di NodeJS


100

Saya menggunakan NodeJS untuk memasukkan dokumen di MongoDB. Menggunakan collection.insertI dapat memasukkan dokumen ke dalam database seperti dalam kode ini:

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

Bagaimana saya bisa mendapatkan _idobjek yang disisipkan?

Apakah ada cara untuk mendapatkan _idtanpa memasukkan objek terbaru _id?

Misalkan dalam waktu yang sama banyak orang yang mengakses database, saya tidak bisa memastikan apakah id terbaru adalah id dari objek yang disisipkan.

Jawaban:


88

Ada parameter kedua untuk callback collection.insertyang akan mengembalikan dokumen atau dokumen yang dimasukkan, yang seharusnya memiliki _ids.

Mencoba:

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

dan periksa konsol untuk melihat apa yang saya maksud.


4
Callback sebenarnya mengembalikan berbagai dokumen yang dimasukkan. Jadi, jika Anda telah memasukkan satu dokumen maka Anda dapat mengakses catatan yang disisipkan seperti di bawah ini. collection.insert ({name: "David", title: "About MongoDB"}, function (err, records) {console.log ("Record added as" + records [0] ._ id);}); Ref: mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
Rohit Singh Sengar


tautan tidak mengarah ke mana pun yang berguna
davidhadas

Saya tidak tahu apakah ini umum atau hanya berfungsi di meteor, tetapi ketika Anda memanggil collection.insert (object), itu mengembalikan id dari objek yang dimasukkan segera.
vantesllar

4
docsInserted tidak mengembalikan _id untuk saya. itu mengembalikan untuk saya {"ok": 1, "n": 1, "opTime": {"ts": "6361004504208375809", "t": 5}, "pemiluId": "7fffffff0000000000000005"}
user1709076

90

Cara yang lebih pendek daripada menggunakan parameter kedua untuk callback collection.insertakan menggunakan objectToInsert._idyang mengembalikan _id(di dalam fungsi callback, anggap itu adalah operasi yang berhasil).

Driver Mongo untuk NodeJS menambahkan _idbidang ke referensi objek asli, sehingga mudah untuk mendapatkan id yang disisipkan menggunakan objek asli:

collection.insert(objectToInsert, function(err){
   if (err) return;
   // Object inserted successfully.
   var objectId = objectToInsert._id; // this will return the id of object inserted
});

4
Sangat berwawasan terima kasih. Tidak dapat menemukan informasi ini di tempat lain sejak perubahan dalam parameter callback.
Brad Hein

@BradHein Sama-sama! Mungkin driver MongoDB memodifikasi referensi objek, sehingga di sini juga akan dimodifikasi. :)
Ionică Bizău

Kode Anda salah, di mana Anda mengatakan var objectId = objectToInsert._id; Anda bermaksud mengatakan var objectId = objectInserted._id;
Andy Lorenz

3
@AndyLorenz Apa itu objectInserted? Saya kira Anda kehilangan inti dari jawaban ini: pengemudi Mongo menambahkan _idbidang ke objek aslinya. Saya mengedit jawaban untuk digunakan di objectToInsertmana-mana. Semoga semuanya lebih jelas sekarang. :)
Ionică Bizău

1
CATATAN: insert()tidak digunakan lagi. Gunakan insertOne()sebagai gantinya
evilReiko

16

Seperti yang dikatakan ktretyak, untuk memasukkan ID dokumen yang disisipkan cara terbaik adalah dengan menggunakan properti insertId pada objek hasil. Dalam kasus saya result._id tidak berfungsi jadi saya harus menggunakan yang berikut:

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

Itu sama saja jika Anda menggunakan callback.


13

Saya benar-benar melakukan console.log () untuk parameter kedua dalam fungsi callback untuk insert. Sebenarnya ada banyak informasi yang dikembalikan selain dari objek yang disisipkan itu sendiri. Jadi kode di bawah ini menjelaskan bagaimana Anda dapat mengakses id itu.

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

Ini menghasilkan file ObjectID {_bsontype: "ObjectID", id: Buffer(12)}. Bagaimana saya bisa menggunakannya untuk mendapatkan id sebenarnya yang ada di database? ... Temukan jawabannya di komentar lain: Gunakanresult.insertedId.toString()
Fadwa

7

Mongo mengirimkan dokumen lengkap sebagai objek panggilan balik sehingga Anda bisa mendapatkannya hanya dari sana.

sebagai contoh

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

4

Sekarang Anda bisa menggunakan metode insertOne dan result.insertedId di promise


Bisakah Anda memberikan contoh kode? Dari mana asal objek hasil ini?
JSideris

@JSideris, seperti yang Anda lihat di metode spesifikasi insertOne () , metode ini menerima tiga parameter (doc, options, callback). Parameter ketiga - panggilan balik, yang mengambil dua parameter (error, result) . Dan result- inilah yang Anda cari.
ktretyak

2

@JSideris, contoh kode untuk mendapatkan insertId.

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

2

jika Anda ingin mengambil "_id" gunakan simpley

result.insertedId.toString() 

// toString akan mengkonversi dari hex


Itulah yang saya cari. Terima kasih.
Fadwa

Ya, pasti ada perubahan versi karena jawaban lain tidak menyebutkan result.insertedIdadalah ObjectIDobjek tipe. .toString()akan mengubah objek ini menjadi UUID yang sebenarnya.
Dylan Pierce

0

Anda bisa menggunakan fungsi async untuk mendapatkan kolom _id secara otomatis tanpa memanipulasi objek data:

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

  await db.collection('users', data )

  return data
}

Mengembalikan data:

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

0

Cara lain untuk melakukannya dalam fungsi async:

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;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.