Вопрос

Я создал массив в моем документе Mongo, поэтому он выглядит немного похоже на следующее:

{ "_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
.

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

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

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

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

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

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

Спасибо,

Дэн

Это было полезно?

Решение

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

{ "_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 } ] }
.

в основном вы пытаетесь нажать в документ, а не массив.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top