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
}
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
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 device
id
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.