La mise à jour de la matrice de dans mongodb enregistrement avec la mangouste
Quelle est la meilleure façon de mettre à jour une valeur dans un tableau enregistré dans un mongodb record? Actuellement, je suis en train d'essayer de cette façon:
Record.find({ 'owner': owner}, {}, {sort: { date: -1 }}, function(err, record){
if(!err){
for (var i = 0; i < record[0].array.length; i++){
record[0].array[i].score = 0;
record[0].array[i].changed = true;
record[0].save();
}
}
});
Et le schéma ressemble à ceci:
var recordSchema = mongoose.Schema({
owner: {type: String},
date: {type: Date, default: Date.now},
array: mongoose.Schema.Types.Mixed
});
Maintenant, je peux voir que le tableau des mises à jour, je n'ai pas d'erreur lors de la sauvegarde, mais quand j'ai une requête à la base de données à nouveau, le tableau n'a pas été mis à jour.
Pourquoi enregistrer le document à l'intérieur de la boucle?
Je l'ai essayé à la fois à l'intérieur et à l'extérieur, le tableau n'est toujours pas mis à jour
Je crois que votre requête doit également
Merci, je vais changer cela
Je l'ai essayé à la fois à l'intérieur et à l'extérieur, le tableau n'est toujours pas mis à jour
Je crois que votre requête doit également
null
où vous avez un objet vide dans ses arguments. Mangouste docsMerci, je vais changer cela
OriginalL'auteur alreadytaken | 2013-07-25
Vous devez vous connecter pour publier un commentaire.
Il serait utile si vous expliqué votre intention, ici, que nommer une propriété "array" indique rien au sujet de son but. Je suppose que de votre code, vous espérez aller et définir le score de chaque élément y de zéro. Remarque votre sauvegarde est actuellement ignorés parce que vous ne pouvez enregistrer des haut-niveau de la mangouste documents, pas de documents imbriqués.
Certains de trouver et de modifier les opérations sur les tableaux peut être fait avec une seule commande de base de données à l'aide de la La Matrice De Mise À Jour Des Opérateurs comme
$push
,$addToSet
, etc. Cependant, je ne vois pas les opérateurs qui peuvent directement faire votre changement souhaité en une seule opération. Ainsi, je pense que vous avez besoin de trouver votre fiche, modifier le tableau de la date et de l'enregistrer. (NotefindOne
est une fonction de commodité, vous pouvez utiliser si vous ne se soucient que du premier match, ce qui semble être le cas pour vous).Je ne pense pas qu'il y a un schéma qui fait de cette 1-commande de l'opération. Vous pourriez tout simplement mettre le "tableau" de la documentation dans un totalement distincte de la collection avec les champs:
score, record_id, changed, order
propriétés, dans ce cas, vous pouvez réinitialiser tous à la fois avec un multi-mise à jour. Cependant, vous perdez la belle capacité à gérer l'ordre dans le tableau. Donc, il dépend de l'ordre dans le tableau est importante pour votre application et si ce type de produits en vrac reset est un cas commun ou d'un cas limite vs avoir besoin de charger toutes les données pour une opération de lecture.OriginalL'auteur Peter Lyons
Si vous avez une mangouste objet d'un document, vous pouvez bien sûr mettre à jour le tableau, comme dans la question, à la suite de mise en garde.
C'est en fait une mangouste gotcha. Mangouste ne peut pas suivre les changements de la matrice de mélange, on doit utiliser markModified:
OriginalL'auteur Ron Wertlen