Mongo 推送到数组内的数组

kha*_*wan 5 python mongodb

我是 mongo 的新手,到目前为止使用它没有问题。直到我坚持这一点。我需要将文档推送到数组内的数组。可以参考下面的json。

{
    'user_id':'{1231mjnD-32JIjn-3213}',
    'name':'John',
    'campaigns':
        [
            {
                'campaign_id':3221,
                'start_date':'12-01-2012',
                'messages':
                    [
                        {
                            'message_id':211134,
                            'email':'john@gmail.com'
                        }
                    ]
            },
            {
                'campaign_id':3222,
                'start_date':'13-01-2012',
                'messages':
                    [
                        {
                            'message_id':315521,
                            'email':'john@gmail.com'
                        }
                    ]
            }
        ]
}
Run Code Online (Sandbox Code Playgroud)

我想将一个文档推送到活动数组中的一组消息(无论排序如何)。这意味着,我需要将新文档附加到消息数组中。所有这些消息都来自每个用户的另一个数组或活动。我使用 python 所以我的代码会是这样的。

query = {"user_id" : "{1231mjnD-32JIjn-3213}", "campaigns.campaign_id": 3221}
message = {"message_id":4213122, "email":"john@gmail.com"}
op = {"$push" : {"campaigns.messages":message}}
mongo.TestDatabase.members.update(query, op)
Run Code Online (Sandbox Code Playgroud)

执行时没有错误。但是文档似乎没有变化(没有进行更新)。我在这里做错了什么?

Rem*_*iet 5

出于多种原因,在数组中包含数组几乎总是一个坏主意。我会将这些活动放在一个专门的集合中,以便它们成为顶级文档。

也就是说,您可以通过以下方式推送到特定活动的消息数组:

db.members.update(
    {"user_id" : "{1231mjnD-32JIjn-3213}", "campaigns.campaign_id": 3221},
    {$push:{"campaigns.$.messages":{"message_id":4213122, "email":"john@gmail.com"}}}
)
Run Code Online (Sandbox Code Playgroud)

  • 是的,更重要的是,您永远无法在不覆盖整个数组的情况下编辑消息,因为您不允许使用多个位置运算符 ($)。在此处修复此问题 https://jira.mongodb.org/browse/SERVER-831 (2认同)