NodeJS'de Mongo veritabanına eklenen belgenin _id bilgisini alın


100

MongoDB'ye belge eklemek için NodeJS kullanıyorum. Kullanarak collection.insertşu koddaki gibi veritabanına bir belge ekleyebilirim:

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

_idEklenen nesneyi nasıl alabilirim ?

_idEn son nesneyi takmadan elde etmenin bir yolu var mı _id?

Aynı zamanda birçok insanın veritabanına eriştiğini varsayarsak, en son kimliğin eklenen nesnenin kimliği olduğundan emin olamıyorum.

Yanıtlar:


88

Geri arama için collection.insert, eklenen dokümanı veya _ids içermesi gereken dokümanları döndürecek ikinci bir parametre vardır .

Deneyin:

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

ve ne demek istediğimi görmek için konsolu kontrol edin.


4
Geri arama aslında eklenen belgelerin dizisini döndürür. Dolayısıyla, tek bir belge eklediyseniz, eklenen kayda aşağıdaki gibi erişebilirsiniz. collection.insert ({ad: "David", başlık: "MongoDB Hakkında"}, işlev (hata, kayıtlar) {console.log ("Kayıt eklendi" + kayıtlar [0] ._ id);}); Ref: mongodb.github.io/node-mongodb-native/markdown-docs/insert.html
Rohit Singh


bağlantı yararlı hiçbir yere götürmez
davidhadas

Bunun genel mi yoksa sadece meteor'da mı işe yaradığını bilmiyorum, ancak collection.insert (nesne) 'yi çağırdığınızda, eklenen nesnenin kimliğini hemen döndürür.
vantesllar

4
docsInserted benim için bir _id döndürmüyor. benim için {"ok": 1, "n": 1, "opTime": {"ts": "6361004504208375809", "t": 5}, "electionId": "7fffffff0000000000000005"}
user1709076

90

Geri araması için ikinci parametreyi kullanmaktan daha kısa bir yol , (başarılı bir işlem olduğunu varsayarak geri arama işlevinin içinde) döndüren collection.insertkullanmaktır .objectToInsert._id_id

NodeJS için Mongo sürücüsü, _idalanı orijinal nesne referansına ekler , böylece eklenen kimliği orijinal nesneyi kullanarak almak kolaydır:

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

4
Çok anlayışlı teşekkür ederim. Geri arama parametrelerindeki değişiklikten bu yana bu bilgiler başka hiçbir yerde bulunamadı.
Brad Hein

@BradHein rica ederim! Muhtemelen MongoDB sürücüsü nesne referansını değiştirir, bu yüzden burada da değiştirilir. :)
Ionică Bizău

Kodunuz yanlış, var objectId = objectToInsert._id dediğiniz yerde; var objectId = objectInserted._id demek istediniz;
Andy Lorenz

3
@AndyLorenz Nedir objectInserted? Sanırım bu cevabın tam anlamını kaçırıyorsunuz: Mongo sürücüsü _idalanı orijinal nesneye ekler . Her objectToInsertyerde kullanmak için cevabı düzenledim . Umarım işler şimdi daha nettir. :)
Ionică Bizău

1
NOT: insert()kullanımdan kaldırılmıştır. insertOne()Bunun yerine kullanın
evilReiko

16

Ktretyak'ın dediği gibi, eklenen belgenin kimliğini almanın en iyi yolu, sonuç nesnesinde insertId özelliğini kullanmaktır. Benim durumumda result._id işe yaramadı, bu yüzden aşağıdakileri kullanmak zorunda kaldım:

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

Geri aramaları kullanırsanız aynı şey geçerlidir.


13

Aslında insert için geri arama işlevindeki ikinci parametre için bir console.log () yaptım. Eklenen nesnenin kendisinden ayrı olarak dönen birçok bilgi var. Dolayısıyla aşağıdaki kod, kimliğine nasıl erişebileceğinizi açıklamaktadır.

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

Bu bir ObjectID {_bsontype: "ObjectID", id: Buffer(12)} . Veritabanındaki gerçek kimliği almak için nasıl kullanabilirim? ... Cevabı başka bir yorumda result.insertedId.toString()
buldum

7

Mongo, belgenin tamamını geri arama nesnesi olarak gönderir, böylece yalnızca oradan kolayca alabilirsiniz.

Örneğin

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


2

@JSideris, eklenenId'yi almak için örnek kod.

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

2

"_id" almak istiyorsanız simpley kullanın

result.insertedId.toString() 

// toString, hex'den dönüştürülecek


Aradığım buydu. Teşekkür ederim.
Fadwa

Evet, diğer cevapların bahsetmediği result.insertedIdbir ObjectIDtip nesnesi olduğu için bir sürüm değişikliği olmuş olmalı . .toString()bu nesneyi gerçek bir UUID'ye dönüştürür.
Dylan Pierce

0

_İd alanını veri nesnesini değiştirmeden otomatik olarak almak için zaman uyumsuz işlevleri kullanabilirsiniz :

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

  await db.collection('users', data )

  return data
}

Verileri döndürür:

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

0

Eşzamansız işlevde yapmanın başka bir yolu:

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.