Mettre à jour un tableau multi-imbriqué dans Mongodb
J'ai un document de schéma dans Mongodb qui ressemble à ceci:
{
_id: 1
tags: [{
tag: 'foo'
links: [{
link: 'http:www.google.com'
date: '123'
}]
}]
}
Je suis en train de pousser un lien dans les "liens" de tableau qui sera unique pour le document.
Ma première requête...
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo'}}},
{upsert: true}
)
Me donne ce (crée le tag s'il n'existe pas)
{ "_id" : 1, "tags" : [ { "tag" : "foo" } ] }
J'ai ensuite suivi avec cette requête...
db.userlinks.update (
{_id: 1, tags: {tag: 'foo', links: {$nin: [{link: 'http://www.google.com'}]}}},
{$push: {tags: {tag: 'foo', links: {link: 'http://www.google.com', date: '123'}}}},
{upsert: true}
)
Mais j'obtiens cette erreur: "Impossible d'appliquer des $push/$pushAll modificateur de non-array"
Je suis sûr que le problème est dans la "mise à jour" de mon deuxième requête, mais je ne suis pas sûr de la façon de le résoudre. Toute aide serait appréciée.
MODIFIER
Ma première requête est maintenant... (merci à Joe)
db.userlinks.update (
{_id: 1, tags: {$nin: [{tag:'foo'}]}},
{$push: {'tags': {tag:'foo', links:[]}}},
{upsert: true}
)
Ma deuxième requête est maintenant...
db.userlinks.update (
{_id: 1, 'tags.tag': 'foo'},
{$push: {'tags.$.links': {link: 'http://www.google.com', date: '123'} } }
)
Avec succès pousse le lien dans les "liens" de tableau, mais il permet également à des doublons. Je ne peux me permettre de liens en double. $addToSet type de travaux, toutefois, si la date change, alors il encore insère un lien dupliquer.
Est-il un moyen de vérifier l'existence du lien dans le "query" une partie de ma deuxième requête, ou plutôt seulement addToSet si certains champs match?
source d'informationauteur | 2013-04-14
Vous devez vous connecter pour publier un commentaire.
J'ai enfin eu... bien que si quelqu'un peut voir une meilleure façon pour ce faire, veuillez l'ajouter comme une réponse.
Peut-être changer votre première requête pour:
$Pousser opération ne devrait toucher que les liens, pas de la balise.