在数组内的数组中推送Mongo

8 投票
2 回答
11548 浏览
提问于 2025-04-17 12:40

我刚开始接触MongoDB,目前使用起来还挺顺利的。直到我遇到了一个问题。我需要把一个文档添加到一个数组里的数组中。可以参考下面的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'
                        }
                    ]
            }
        ]
}

我想把一个文档添加到一个名为“campaigns”的数组中的“messages”数组里(不考虑顺序)。也就是说,我需要把新文档附加到“messages”这个数组里。而这些消息都是来自每个用户的另一个数组或“campaigns”中。我用的是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)

执行时没有错误。但是文档似乎没有任何变化(没有更新)。我哪里做错了呢?

2 个回答

0

如果你遇到了错误mongodb 的位置操作符没有找到查询所需的匹配项。 那么你需要使用$elemMatch来先选择父数组。

await Booking.findOneAndUpdate(
              {
                _id: data.id,
                products: {
                  $elemMatch: {
                    id: product.id,
                  },
                },
              },
              {
                $push: {
                  'products.$.slots': {
                    $each: product.slots.map((slot) => {
                      return { id: slot.id, discount: slot.discount };
                    }),
                  },
                },
              },
              { new: true }
            );
          
9

把数组放在数组里面通常不是个好主意,原因有很多。我建议把活动放在一个专门的集合里,这样它们就可以成为顶层的文档。

不过,你可以通过以下方式向某个特定活动的消息数组中添加内容:

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

撰写回答