Обновить элементы массива монго по индексу с помощью c-драйвера - PullRequest
2 голосов
/ 03 марта 2012

Чтобы обновить элементы массива Монго, я использовал такой синтаксис:

{"$set":{"a.0":1238},{"a.1":402}}

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

a: {"0":1238,"1":402}

вместо:

a: [1238,402]

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

1 Ответ

5 голосов
/ 03 марта 2012

Если поле не существует, то этот запрос точечной нотации создаст его как хеш (объект) и присвоит значения ключам этого хеша. Если поле существует и является массивом, оно будет вести себя так, как вы ожидаете. Смотрите этот сеанс.

> db.arrays.insert({});
> db.arrays.find();
{ "_id" : ObjectId("4f518c8b58713e4dbadbfb9f") }
> db.arrays.update({ "_id" : ObjectId("4f518c8b58713e4dbadbfb9f") }, {$set: {"a.0": 123}});
> db.arrays.find();
{ "_id" : ObjectId("4f518c8b58713e4dbadbfb9f"), "a" : { "0" : 123 } }


> db.arrays.insert({a: []})
> db.arrays.find();
{ "_id" : ObjectId("4f518c8b58713e4dbadbfb9f"), "a" : { "0" : 123 } }
{ "_id" : ObjectId("4f518cca58713e4dbadbfba0"), "a" : [ ] }
> db.arrays.update({ "_id" : ObjectId("4f518cca58713e4dbadbfba0") }, {$set: {"a.0": 123}});
> db.arrays.find();
{ "_id" : ObjectId("4f518c8b58713e4dbadbfb9f"), "a" : { "0" : 123 } }
{ "_id" : ObjectId("4f518cca58713e4dbadbfba0"), "a" : [ 123 ] }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...