MongoDB Update $push Невозможно применить позиционный оператор без соответствующего поля запроса, содержащего массив

Модель:

{
    "_id" : "a62107e10f388c90a3eb2d7634357c8b",
    "_appid" : [
        {
            "_id" : "1815aaa7f581c838",
            "events" : [
                {
                    "_id" : "_TB_launch",
                    "boday" : [
                        {
                            "VERSIONSCODE" : "17",
                            "NETWORK" : "cmwap",
                            "VERSIONSNAME" : "2.4.0",
                            "IMSI" : "460026319223205",
                            "PACKAGENAME" : "com.androidbox.astjxmjmmshareMM",
                            "CHANNELID" : "xmjmm17",
                            "CHANNELNAME" : "浠..?.M寰.俊?.韩?.?1.x锛.,
                            "eventid" : "_TB_launch",
                            "uuid" : "a62107e10f388c90a3eb2d7634357c8b",
                            "creattime" : "1366300799766",
                            "ts" : ISODate("2013-04-25T06:28:36.403Z")
                        }
                    ],
                    "size" : 1
                }
            ],
            "size" : 1
        }
    ],
    "size" : 1
}
> db.events.update(
    {
        "_id":"039e569770cec5ff3811e7410233ed27",
        "_appid._id":"e880db04064b03bc534575c7f831a83a",
        "_appid.events._id":"_TB_launch"
    },
    {
        "$push":{
            "_appid.$.events.$.boday":{"111":"123123"}
        }
    }
);

Невозможно применить позиционный оператор без соответствующего поля запроса, содержащего массив.

Зачем?!!

2 ответа

Вы пытаетесь сослаться на несколько уровней встраивания - у вас может быть только один позиционный оператор $. Вы не сможете сделать что-то подобное, пока не будет реализован этот запрос.

Ответ здесь Краткий ответ - "нет", но работать с вложенными массивами становится сложно. Вот пример:

db.foo.save({_id: 1, a1:[{_a1id:1, a2:[{a2id:1, a3:[{a3id:1, a4:"data"}]}]}]})
db.foo.find()
{ "_id" : 1, "a1" : [
 { "_a1id" : 1, "a2" : [
  { "a2id" : 1, "a3" : [
   { "a3id" : 1, "a4" : "data" }
  ] }
 ] }
] }

db.foo.update({_id:1}, {$push:{"a1.0.a2.0.a3":{a3id:2, a4:"other data"}}})
db.foo.find()
{ "_id" : 1, "a1" : [
 { "_a1id" : 1, "a2" : [
  { "a2id" : 1, "a3" : [
   { "a3id" : 1, "a4" : "data" }, 
   { "a3id" : 2, "a4" : "other data" }
  ] }
 ] }
] }

Если вы не уверены, где один из ваших вложенных документов лежит в массиве, вы можете использовать один позиционный оператор, и Mongo обновит первый соответствующий вложенный документ. Например:

db.foo.update({_id:1, "a1.a2.a2id":1}, {$push:{"a1.0.a2.$.a3":{a3id:2, a4:"other data"}}}) 
Другие вопросы по тегам