Ошибка обновления массива в Mongo - PullRequest
4 голосов
/ 09 марта 2012

Я создал массив в своем монго-документе, поэтому он выглядит примерно так:

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

Затем я пытаюсь вставить новое значение в массив, выполнив:

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

Однако я получаю ошибку:

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

Кажется, единственный способ, которым я действительно могу добавить информацию в массив, - это использовать точечную запись, например,

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

Кажется, это работает, но когда у меня есть массив из примерно 30 значений, это кажется немного утомительным.

Просто для ясности, я использую литиевую среду PHP, а не просто ввожу их вручную, поэтому я мог бы перебирать массив для добавления «деталей». к каждому ключу, но я не думаю, что это необходимо. Я что-то упускаю из-за того, почему он не помещает значения в массив?

(мой литиевый код был следующим:)

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

Спасибо

Dan

1 Ответ

4 голосов
/ 09 марта 2012

«детали» - это внедренный документ, а не массив. Если бы это был массив, он бы выглядел следующим образом (обратите внимание на [], указывающий массив):

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

Если вы затем нажмете $ push:

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

Вы получите ожидаемый результат:

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

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

Обычно вы пытаетесь отправить документ, а не массив.

...