sql >> Databasteknik >  >> NoSQL >> MongoDB

mongoDB :Skapa ett objekt-ID för varje nytt barn som läggs till i matrisfältet

Inte en mongodb expert men om jag förstår dig rätt vill du att fältet _id i underdokumentet ska infogas automatiskt.

Jag skapade threads db och infogade sedan det första message i messages samling med följande kommando:

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

Lägg märke till _id:ObjectId() fält. Resultatet är följande:

Nu när jag har en ObjectId(56...) , jag kan uppdatera just den posten och infoga fler meddelanden till den. Och kommandot är som följer:

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

Och ovanstående skulle infoga det nya meddelandet i samlingen. Se nedanstående skärmdumpar:

och slutligen efter några uppdateringar ser samlingen ut som följer:

Alla _id-fält i messages array genereras automatiskt.

Det kanske inte är en bra idé att använda _id fält av olika anledningar. Vänligen Google för mer information om huruvida _id ska användas som nyckel för underdokument eller inte.

Jag använde MongoDB-skalversion 3.0.6 för kommandona.

REDIGERA 2016-01-28 16:09

Eftersom ovanstående lösning var baserad på MongoDB-skal, bestämde jag mig för att göra ett nytt test med Node.js-drivrutinen för MongoDB. Först och främst deklarerar jag ObjectID-variabel enligt följande

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

Jag kommer att använda ObjectID med dokument-id för tråden som meddelandet ska infogas i enligt följande i min update och findOneAndUpdate funktionsanrop

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

Testade båda och fungerar bra. Se skärmdumpen nedan:



  1. Apache HBase Göra och inte göra

  2. MongoDB root-användare

  3. Hur implementerar man trigger för redis datastore?

  4. Stöder azure saker som mongodb och redis?