在数组内的数组中推送Mongo
我刚开始接触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"}}}
)