sql >> Database teknologi >  >> NoSQL >> MongoDB

mongoDB:Oprettelse af et objekt-id for hvert nyt barn, der føjes til array-feltet

Ikke en mongodb ekspert, men hvis jeg forstår dig rigtigt, ønsker du, at underdokumentets _id-felt indsættes automatisk.

Jeg oprettede threads db og indsatte derefter den første message i messages samling ved hjælp af følgende kommando:

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

Læg mærke til _id:ObjectId() Mark. Resultatet er som følger:

Nu hvor jeg har en ObjectId(56...) , jeg kan opdatere den pågældende post og indsætte flere beskeder til den. Og kommandoen er som følger:

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

Og ovenstående ville indsætte den nye besked i samlingen. Se nedenstående skærmbilleder:

og endelig efter et par opdateringer ser samlingen ud som følger:

Alle _id-felterne i messages array genereres automatisk.

Det er måske ikke en god idé at bruge _id felter af forskellige årsager. Google venligst for flere detaljer om, hvorvidt du skal bruge _id som nøgle til underdokumenter eller ej.

Jeg brugte MongoDB shell version 3.0.6 for kommandoerne.

EDIT 28-01-2016 16:09

Da ovenstående løsning var baseret på MongoDB shell, besluttede jeg at lave en anden test ved hjælp af Node.js driver til MongoDB. Først og fremmest erklærer jeg ObjectID variabel som følger

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

Jeg vil bruge ObjectID'et med dokument-id'et for den tråd, som meddelelsen skal indsættes i som følger i min update og findOneAndUpdate funktionskald

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

Har testet begge og fungerer fint. Se skærmbilledet nedenfor:



  1. Hvordan ændrer man strukturen af ​​MongoDBs kort-reducer resultater?

  2. Ret "indeksnavn skal være en streng", når du dropper flere indekser i MongoDB

  3. MongoDB replikasæt med simpel adgangskodegodkendelse

  4. Redis-forbindelse/bufferstørrelsesgrænse overskredet