Pergunta

Eu criei um array em meu documento mongo, então ele se parece um pouco com o seguinte:

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

Estou então tentando enviar um novo valor para a matriz, fazendo:

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

No entanto, recebo o erro:

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

Parece que a única maneira de adicionar as informações ao array é usar a notação de ponto para adicioná-las, por exemplo.

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

Isso parece funcionar, mas quando tenho uma matriz de cerca de 30 valores, parece um pouco entediante.

Apenas para maior clareza, estou usando a estrutura de lítio PHP, não apenas entrando nelas manualmente, para que eu possa percorrer uma matriz para prender os 'detalhes'. para cada chave, mas não acho que isso seja necessário.Há algo que estou perdendo sobre por que ele não envia valores para a matriz?

(Meu código de lítio era o seguinte:)

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

Obrigado,

Dan

Foi útil?

Solução

"detalhes" é um documento incorporado, não uma matriz.Se fosse um array ficaria assim (observe o [] indicando um array):

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

Se você fizer um $push:

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

Você obtém o resultado esperado:

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

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

Basicamente, você está tentando enviar para um documento, não para um array.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top