Question

J'ai créé un tableau dans mon document Mongo, il semble donc un peu comme ce qui suit:

{ "_id" : ObjectId("4f59e19d0b7aab2903000004"), 
  "details" : { x:1, y:2 }
}

Je tente alors de pousser une nouvelle valeur au tableau, faisant:

db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{$push: {"details": {"z":3}}});

Cependant, je reçois l'erreur:

Cannot apply $push/$pushAll modifier to non-array

Il semble que je sèle le seul moyen de pouvoir ajouter les informations au tableau, consiste à utiliser la notation de points pour l'ajouter, par exemple

db.users.update({"_id" : ObjectId("4f59e19d0b7aab2903000004")},{"details.z": 3});

Cela semble fonctionner, mais lorsque j'ai une éventail d'environ 30 valeurs, cela semble un peu fastidieux.

Juste pour la clarté, j'utilise le cadre PHP du lithium, pas seulement l'entrer manuellement, je pourrais donc boucler à travers un tableau pour préparer les "détails".à chaque clé, mais je ne pense pas que cela devrait être nécessaire.Y a-t-il quelque chose qui me manque pourquoi il ne poussera pas les valeurs dans le tableau?

(mon code de lithium était comme suit :)

User::update(array('$push'=>array('details'=>array('z'=>3))), array('_id'=>$id))

merci,

dan

Était-ce utile?

La solution

"Détails" est un document intégré, pas un tableau.Si c'était un tableau, cela ressemblerait à ceci (notez le [] indiquant un tableau):

{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"), 
       "details" : [ { "x" : 1 }, { "y" : 2 } ] }

Si vous faites alors une poussée $:

db.users.update({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")}, 
                {$push : {"details": {"z":3}}})

Vous obtenez le résultat attendu:

db.users.find({"_id" : ObjectId("4f59f0531ae8f3b5f92246fe")})

{ "_id" : ObjectId("4f59f0531ae8f3b5f92246fe"), 
  "details" : [ { "x" : 1 }, { "y" : 2 }, { "z" : 3 } ] }

En gros, vous essayez d'appuyer sur un document, pas un tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top