MongoDB - $ mis à jour ou à pousser l'élément Array
Dans les produits de la collection, j'ai un Tableau de recentviews qui a plus de 2 champs viewedBy & viewedDate.
Dans un scénario si j'ai déjà un record avec viewedby
puis j'ai besoin de le mettre à jour. Pour l'e.g si j'ai array comme ceci :-
"recentviews" : [
{
"viewedby" : "abc",
"vieweddate" : ISODate("2014-05-08T04:12:47.907Z")
}
]
Et l'utilisateur est abc
j'ai donc besoin de mise à jour ci-dessus & si il n'y a pas de record pour abc
je $push
.
J'ai essayé $set
comme suit :-
db.products.update( { _id: ObjectId("536c55bf9c8fb24c21000095") },
{ $set:
{ "recentviews":
{
viewedby: 'abc',
vieweddate: ISODate("2014-05-09T04:12:47.907Z")
}
}
}
)
La requête ci-dessus efface tous mes autres éléments dans le Tableau.
source d'informationauteur Anup
Vous devez vous connecter pour publier un commentaire.
En train de faire ce qu'elle ressemble à vous dire que vous faites n'est pas une seule opération, mais je vais marcher à travers les pièces nécessaires afin de faire ceci ou de couvrir d'autres situations.
Ce que vous cherchez est dans le cadre de la position
$
de l'opérateur. Vous avez besoin d'une partie de votre question, également, de "trouver" l'élément de la matrice que vous voulez.De sorte que le
$
représente la position correspondante dans le tableau afin que la mise à jour de la partie sait quel élément dans la matrice de mise à jour. Vous pouvez accéder aux différents champs du document dans le tableau ou il suffit de spécifier l'ensemble du document pour mettre à jour à cette position.Si le champs n'en fait pas la changer et vous voulez juste pour insérer un nouvel élément de tableau si l'exact même n'existe pas, alors vous pouvez utiliser
$addToSet
Toutefois, si vous cherchez juste pour "pousser" à un tableau par une singulière valeur de la clé si cela n'existe pas, alors vous avez besoin de faire un peu plus de la manutention manuelle, d'abord voir si l'élément dans le tableau existe, et ensuite faire la
$push
déclaration où il ne l'est pas.Vous obtenir de l'aide de la mangouste méthodes en faisant cela, par le suivi du nombre de documents concernés par la mise à jour:
Le seul mot d'avertissement ici est qu'il y est un peu de la mise en œuvre du changement dans le writeConcern messages de MongoDB 2.6 pour les versions antérieures. Les doutes de droit maintenant à savoir comment la mangouste API en fait met en œuvre le retour de la
numAffected
argument dans la fonction de rappel de la différence pourrait signifier quelque chose.Dans les versions précédentes, même si les données que vous avez envoyé dans la mise à jour initial correspondait exactement un élément existant et il n'y a pas de réel changement nécessaire, alors le "modifié" le montant serait retourné comme
1
même si rien n'a réellement été mis à jour.De MongoDB 2.6 l'écriture, à la préoccupation de la réponse contient deux parties. Une seule partie montre le document modifié et l'autre montre le match. Ainsi, alors que le match allait être renvoyés par la requête de la partie correspondant à un élément existant, le document modifié comte de retour comme
0
si en fait il n'y a aucun changement nécessaire.Donc, en fonction de la façon dont le numéro de retour est réellement mis en œuvre dans la mangouste, il pourrait en fait être plus sûr d'utiliser le
$addToSet
opérateur sur centre de mise à jour pour s'assurer que si la raison pour laquelle le zéro documents concernés n'était pas juste que l'élément existe déjà.