2016-04-29 2 views
0

J'ai document simple:déclaration de mise à jour de Mongo

/* 1 */ 
{ 
    "_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
    "Settings" : [ 
     [ 
      "Storage", 
      "Dedicated" 
     ], 
     [ 
      "Country", 
      "EE" 
     ], 
     [ 
      "Address", 
      "http://localhost:55557" 
     ], 
     [ 
      "Number", 
      "05" 
     ] 
    ] 
} 

ne peut comprendre comment écrire la déclaration de mise à jour pour mettre à jour les informations d'adresse "http://localhost:55557" à address.something IP comme http://10.10.20.2:66667

+2

Un tel schéma est extrêmement difficile à interroger et à mettre à jour dans MongoDB. Envisagez de modifier le schéma de sorte que les tableaux incorporés soient aplatis dans un document avec des paires de champs/valeurs appropriées. – chridam

+0

chridam- Je ne peux pas mettre à jour le schéma, si je pouvais le réparer avec des paires de champs/valeurs correctes. Je sais que ce n'est pas bon. – vencrena

Répondre

3

La conception du schéma est incorrect , car il n'y a pas de clé pour la valeur que vous voulez mettre à jour. Pensez à changer votre schéma comme suit

{ 
_id : "9cbfceec-d6f6-5638-b7c9-49103dc39665", 
settings : 
    { 
     storage:"Dedicated", 
     country:"EE", 
     address:"http://localhost:55557", 
     number:"05" 
    } 
} 

Le schéma ci-dessus a clé pour chaque valeur dans des contextes plutôt que d'avoir un double tableau. Toute valeur est accessible et modifiable dans le document ci-dessus.

Vous pouvez ensuite mettre à jour le document comme suit

db.settings.update({ 
    _id: "9cbfceec-d6f6-5638-b7c9-49103dc39665" 
}, { 
    $set: { 
    "settings.address": "http://10.10.20.2:66667" 
    } 
}); 
+0

Votre solution proposée devrait fonctionner si le schéma était bon. mais cela ne résout pas mon problème avec le double tableau. Je ne peux pas modifier le schéma. – vencrena

+1

il n'y a aucun moyen d'accéder à l'adresse directement, car l'adresse n'est pas une clé. L'adresse est le premier élément d'un tableau et la valeur qui lui est associée est la deuxième valeur. Donc, le seul moyen de contourner ce problème serait de trouver le document, de récupérer le tableau des paramètres et de trouver l'adresse en effectuant une comparaison de chaînes pendant l'itération sur le tableau. Vous allez ensuite mettre à jour la valeur dans le document puis mettre à jour le document entier dans la collection. –

+0

Oui, j'ai déjà utilisé ce modèle que vous avez proposé. J'ai donc pensé qu'il était possible de le faire plus facilement. Merci de votre aide. – vencrena

0

chirdam a raison sur le schéma.

Si vous ne disposez pas de disposition pour faire nouveau schéma, vous pouvez essayer ce qui suit:

Essayez cette requête:

db.yourCollection.update({"_id" : "9cbfceec-d6f6-5638-b7c9-49103dc39665", "Settings.Address" : "http://localhost:55557"} , { $set : {"Settings.$.Address" : "http://10.10.20.2:66667"}}); 

Ou alternative est d'utiliser RoboMongo pour modifier manuellement votre collection

+0

Je connais le schéma. Votre solution n'aide pas non plus dans mon cas car il s'agit d'un double tableau. – vencrena