sql >> Database >  >> NoSQL >> MongoDB

mongoDB:een object-ID maken voor elk nieuw kind dat aan het array-veld wordt toegevoegd

Geen mongodb expert, maar als ik u goed begrijp, wilt u dat het _id-veld van het subdocument automatisch wordt ingevoegd.

Ik heb threads gemaakt db en vervolgens het eerste message inserted ingevoegd in de messages verzameling met het volgende commando:

db.messages.insert({messages:[{_id:ObjectId(), message:"Message 1."}]}); 

Let op de _id:ObjectId() veld. Het resultaat is als volgt:

Nu ik een ObjectId(56...) . heb , kan ik dat specifieke record bijwerken en er meer berichten aan toevoegen. En het commando is als volgt:

db.messages.update({"_id":ObjectId("56...")}, 
{$push:{messages:{_id:ObjectId(), message:"I am message 2."}}});

En het bovenstaande zou het nieuwe bericht in de verzameling invoegen. Zie onderstaande screenshots:

en uiteindelijk ziet de collectie er na een paar updates als volgt uit:

Alle _id-velden in de messages array worden automatisch gegenereerd.

Het is misschien geen goed idee om _id . te gebruiken velden om verschillende redenen. Gebruik Google voor meer informatie over het al dan niet gebruiken van _id als sleutel voor subdocumenten.

Ik gebruikte MongoDB shell versie 3.0.6 voor de commando's.

BEWERK 28-01-2016 16:09

Omdat de bovenstaande oplossing gebaseerd was op de MongoDB-shell, besloot ik nog een test uit te voeren met het Node.js-stuurprogramma voor MongoDB. Allereerst declareer ik de ObjectID-variabele als volgt

var ObjectID = require('mongodb').ObjectID;

Ik zal de ObjectID met document-ID van de thread waarin het bericht moet worden ingevoegd als volgt gebruiken in mijn update en findOneAndUpdate functie-aanroepen

app.get('/insertNewMessage', function(req, res) {
    db.collection("messages").findOneAndUpdate({
        _id: new ObjectID('56aa3554e90911b64c36a424')
    }, {
        $push: {
            messages: {
                _id: new ObjectID(),
                message: "From NodeJS with <3 using findOneAndUpdate.Bye."
            }
        }
    }, function(err, result) {
        if (err)
            res.json(err);
        else
            res.json(result);
    });
});

Beiden getest en werken prima. Zie de onderstaande schermafbeelding:



  1. phpredis-extensie werkt niet, kan 'redis.so' niet laden

  2. Hoe Celery-taken te inspecteren en annuleren op taaknaam

  3. Hoe de uitvoer van een redis-abonnement om te leiden?

  4. Script heeft geprobeerd een globale variabele te maken