sql >> Databasteknik >  >> NoSQL >> MongoDB

Mongodb punktfältuppdatering

Naturligtvis gör den det eftersom det är precis vad du ber den att göra. Trots din titel finns det ingen användning av "dot notation" här överhuvudtaget. Detta är naturligtvis vad du vill göra om du tänker inte skriva över befintliga egenskaper. Just nu byter du bara ut hela objektet, trots din användning av $set där om du inte ändrar strukturen här är i princip överflödig.

För att "fixa" detta måste du manipulera dina data objekt först. Med något i den här stilen:

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

Det ger dig och utdata i newobj struktur så här:

{
    "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"
}

Sedan kan du naturligtvis fortsätta med din vanliga uppdatering och få allt rätt:

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

Naturligtvis skulle du behöva lite rekursion för en mer kapslad struktur, men detta borde ge dig den allmänna uppfattningen. Punktnotering är rätt väg att gå, men du måste faktiskt använda den.




  1. Mongo har ingen max()-funktion, hur går jag runt detta?

  2. Hur man säkrar MongoDB med användarnamn och lösenord

  3. Hur kan jag vänta på att en dockningscontainer ska vara igång?

  4. $summa från dokument och underdokument grupp av $author (MongoDB)