db.DB_Name.aggregate([
{ $group: { _id : '$item_id', count: { $sum : 1 } } },
{ $match: { count: { $gt : 1} } }
],{allowDiskUse:true}) // 允许利用磁盘空间,防止出现内存不足
运行输出结果:
跟只需要将单字段的 _id : '$item_id' 后面的 item_id 改成字典格式,即
_id : {item_id:"$item_id",status_Update:"$status_Update"}
// 若是需要多字段的话:
db.DB_Name.aggregate([
{ $group: { _id : {item_id:"$item_id",status_Update:"$status_Update"}, count: { $sum : 1 } } },
{ $match: { count: { $gt : 1} } }
],{allowDiskUse:true}) // 允许利用磁盘空间,防止出现内存不足
运行输出结果:
db.DB_Name.aggregate([
{
$group: { _id: {item_id: '$item_id'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
}, // 若出现重复则把_id加入到dups数组中
{
$match: {count: {$gt: 1}}
}
],{allowDiskUse: true}).forEach( //(使用forEach循环根据_id删除数据)
function(doc){
doc.dups.shift();
db.DB_Name.remove(
{
_id: {
$in: doc.dups
}
}
);
}
)
上面代码为单字段去重,多字段的话同查询一样将 _id后的值改为一个字典的格式,即:
_id : {item_id:"$item_id",status_Update:"$status_Update"} 即可
其中要注意的一点是:
如果数据量过大,可能需要加上allowDiskUse:true 允许其利用磁盘空间,防止出现内存不足的情况
$group中是查询条件;
$count用来统计重复出现的次数, $match来过滤没有重复的数据;
$addToSet将聚合的数据id放入到dups数组中方便后面使用;