MongoDB Update $ push如果没有包含数组的相应查询字段,则无法应用位置运算符

时间:2013-04-25 07:51:31

标签: mongodb mongodb-update

模型:

{
    "_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 个答案:

答案 0 :(得分:2)

您正在尝试引用多个级别的嵌入 - 您只能有一个位置$运算符。在this feature request实施之前,您将无法执行此类操作。

答案 1 :(得分:0)

Response Here 简短的回答是,“不”,但使用嵌套数组得到 棘手。这是一个例子:

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"}}})