MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mise à jour du champ de points Mongodb

Bien sûr que c'est le cas puisque c'est exactement ce que vous lui demandez de faire. Malgré votre titre, il n'y a pas d'utilisation de "dot notation" ici du tout. C'est bien sûr ce que vous voulez faire si vous avez l'intention de ne pas écraser les propriétés existantes. En ce moment, vous remplacez simplement l'objet entier, malgré votre utilisation de $set où, à moins que vous ne changiez la structure ici, c'est fondamentalement redondant.

Pour "réparer" cela, vous devez manipuler vos data objet en premier. Avec quelque chose dans ce sens :

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

Cela vous donne une sortie dans le newobj structure comme ceci :

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

Ensuite, bien sûr, vous pouvez procéder à votre mise à jour normale et tout arranger :

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

Bien sûr, vous auriez besoin d'une récursivité pour une structure plus imbriquée, mais cela devrait vous donner une idée générale. La notation par points est la voie à suivre, mais vous devez réellement l'utiliser.