web-dev-qa-db-fra.com

Mongoose update 'ne peut pas utiliser la partie (..) pour parcourir l'élément

J'ai ce problème vraiment ennuyeux où je ne peux rien mettre à jour avec la mangouste. C'est vraiment frustrant à utiliser, et la documentation n'aide pas du tout.

J'ai ce schéma:

var userSchema = mongoose.Schema({

    local            : {
        email        : String,
        password     : String,
    },
    devices : [{
      id : String,
      name : String
    }]
});

Et c'est le code où je veux ajouter un périphérique au tableau devices:

function updateDeviceList(user, deviceID, deviceName)
{
  User.update({ 'local.email' : user}, 
  { $set: {'devices.id' : deviceID, 'devices.name' : deviceName}}, 
  function(err, response)
  {
    if(err)
    {
      console.log("Update device error", err);
    }
    else {
      console.log("Update device OK");
    }
  });
}

À ce stade, j'obtiens l'erreur: errmsg: 'cannot use the part (devices of devices.id) to traverse the element ({devices: []})' }

Je n'ai pas réussi à trouver une explication à pourquoi cela se produit. Je dois mentionner que le document (il n'y a pratiquement qu'un seul document dans la base de données), est celui-ci:

{
    "_id": {
        "$oid": "5585a196fe11b21100635c74"
    },
    "devices": [],
    "local": {
        "password": "$2a$10$7hXVHw7izcYlqbD6xe/te.0w2zucZ7lA007g9kXdoIMPhZhRyCIru",
        "email": "[email protected]"
    },
    "__v": 0
}
21
Edeph

Utilisez $ Push ou d'autres opérateurs de mise à jour de tableau pour ajouter des éléments à un tableau. Pour plus de détails, reportez-vous à http://docs.mongodb.org/manual/reference/operator/update/Push/#up._S_Push

8

Essayez d'utiliser le positional $ operator dans la mise à jour qui identifie un élément d'un tableau à mettre à jour sans spécifier explicitement la position de l'élément dans le tableau, mais cela ne correspondra qu'à un seul élément à la fois :

 User.update(
    { 
        "local.email": user,
        "devices.id": { "$ne": deviceID },
        "devices.name": { "$ne": deviceName }
    }, 
    { 
        "$set": { 
            "devices.$.id": deviceID,
            "devices.$.name": deviceName 
        }
    } 
);

À partir de docs, l'opérateur positionnel $ agit comme un espace réservé pour le premier élément qui correspond au document de requête et au tableau le champ doit apparaître dans le document de requête, d'où le document de requête

"devices.id": { "$ne": deviceID },
"devices.name": { "$ne": deviceName }

contient le tableau device et correspondra aux documents où le tableau deviceid n'est pas égal à deviceID et le nom n'est pas le même que le nom qui vous essayez de mettre à jour. Cela correspondra même aux documents où le tableau device est vide.

22
chridam