今天遇到在 MongoDB 中,要批量删除子文档(列表类型)中的匹配对象。
首先想到用$pullAll
来实现,结果失败。查找文档得知,$pullAll
要求待删除的对象完全匹配。而$pull
也可以在一次执行过程中删除多个匹配的子文档,所以改用$pull
后实现。现在将示例数据和操作代码整理如下,文档为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ 'type': '四大美女', 'members': [{ 'name': '凤姐', 'mark': 90 }, { 'name': '芙蓉姐姐', 'mark': 95 }, { 'name': '小月月', 'mark': 35 }, { 'name': '方舟子', 'mark': 10000 }], } |
鉴于“凤姐”和“芙蓉姐姐”都去美国发展,所以抹去此二人,使用一条语句完成该删除操作,代码如下:
1 2 |
db.monster.update({'type': '四大美女'}, {'$pull': {'members': {'name': {'$in': ['罗玉凤', '芙蓉姐姐']}}}}) |
到此功能完成。又遇到另一问题,旧的已去,新的要来。比如现在要加入作家“小四”和舞蹈演员“迭戈·科斯塔”,可以使用
$addToSet
向 members 添加。但是却不能写入上面的操作语句。文档中提到,不能在同一语句中对一个 field 执行两种不同的增/删/改操作。所以需要分两次执行 update。