删除整个文档的某几个字段:
db.collection.update({},{$unset: {field1:1,field2:1}},{multi: true});
{uid:{$lt:2000}}, #删除的where条件
{$unset: {name:1,mobile:1}}, #删除的字段,可以多个
{multi: true} #批量删除,无此项则只删除匹配的第一个
不带{multi: true}只匹配删除一条文档记录
> db.team_award.update({uid:{$lt:600}},{$unset: {mobile:1,vip:1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
带条件的多字段批量删除
> db.team_award.update({uid:{$lt:2000}},{$unset: {mobile:1,nickname:1}},{multi: true});
WriteResult({ "nMatched" : 1481, "nUpserted" : 0, "nModified" : 994 })
不带条件的字段批量删除
> db.team_award.update({},{$unset: {id:1}},{multi: true});
WriteResult({ "nMatched" : 394538, "nUpserted" : 0, "nModified" : 394538 })
> db.team_award.findOne();
{
"_id" : ObjectId("6141c099aa08cc1a10128b61"),
"uid" : 508,
"mobile" : "150xxxx5913",
"nickname" : "test",
"vip" : 1,
"pid" : [ ],
"money" : "143.30",
"team_award" : 0,
"award" : 0,
"cycle" : 202108,
"status" : 0,
"create_time" : 1631699075,
"update_time" : 0
}
以上删除的是普通类型的字段,当存储的字段是数组,我们要整个删除时,可用上面方法;如果要删除数组字段中的某个元素字段时则不通用。删除数组字段的某些元素:
#where条件为空则循环全部文档数据,然后每个文档item数组遍历,delete删除数组的元素,然后save保存
db.team_award.find({}).forEach(function(item) {
var pid = item.pid;
for(var i = 0; i < pid.length; ++i) {
if(pid[i]["upid"]){ //循环遍历删除pid数组中的upid字段
delete (pid[i]["upid"]);
}
if(pid[i]["tpid"]){ //循环遍历删除pid数组中的tpid字段
delete (pid[i]["tpid"]);
}
}
db.team_award_20210915.save(item);//删除后保存文档
});
其中
pid
存储的是数组,每个元素包含id
字段,如果是第一个元素,则又包含upid
字段,如果是最后一个元素又包含tpid
字段
> db.team_award.findOne({uid:13457}) #查找一条文档记录
#删除前,数组字段内容
"pid" : [
{
"id" : 3077,
"upid" : 3077
},
{
"id" : 2956
},
{
"id" : 508,
"tpid" : 508
}
],
#删除后,数组字段内容
"pid" : [
{
"id" : 3077
},
{
"id" : 2956
},
{
"id" : 508
}
],
team_award > pid
#删除前:
(Document) 2 Fields 528 528
(Document) 1 Field 525
(Document) 1 Field 524
(Document) 2 Fields 508 508
#删除后:
(Document) 1 Field 528
(Document) 1 Field 525
(Document) 1 Field 524
(Document) 1 Field 508
网友评论