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