sql >> Database >  >> NoSQL >> MongoDB

Mongodb puntveld update

Natuurlijk doet het dat, want dit is precies wat u ervan vraagt. Ondanks je titel, is er geen gebruik van "puntnotatie" hier helemaal niet. Dit is natuurlijk wat u wilt doen als u bestaande eigenschappen niet wilt overschrijven. Op dit moment vervang je gewoon het hele object, ondanks je gebruik van $set waar tenzij je de structuur hier verandert in principe overbodig is.

Om dit te "repareren", moet u uw data manipuleren eerst bezwaar maken. Met iets in de trant van:

var newobj = {};
Object.keys( data ).forEach(function(key) {
    if ( typeof(data[key]) == "object" ) {
       Object.keys( data[key] ).forEach(function(subkey) {
           newobj[key + "." + subkey] = data[key][subkey];
       });
    } else {
       newobj[key] = data[key];
    }
});

Dat geeft je en output in de newobj structuur als volgt:

{
    "postcode" : "BV123456789BY",
    "status.last_check" : 1413539153572,
    "status.code" : "06",
    "status.postnum" : "247431",
    "status.date" : ISODate("2014-10-17T11:28:20.540Z"),
    "status.text" : "06. Поступило в участок обработки почты (247431) Светлогорск - 1"
}

Dan kun je natuurlijk doorgaan met je normale update en alles goed krijgen:

Order.update({ "postcode": newobj.postcode}, { "$set": newobj }, function (err) {
    if (err) console.log(err);
});

Natuurlijk zou je wat recursie nodig hebben voor een meer geneste structuur, maar dit zou je het algemene idee moeten geven. Puntnotatie is de juiste keuze, maar je moet het ook echt gebruiken.




  1. MongoDB $ min

  2. mongo-groepsvraag hoe velden te behouden

  3. Er is een manier om referentiële integriteit af te dwingen in MongoDB

  4. Hoe werk ik Array Elements-overeenkomstcriteria in een MongoDB-document bij?