• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >MongoDB > 使用aggregate在MongoDB中查询重复数据记录的方法

使用aggregate在MongoDB中查询重复数据记录的方法

作者:Jaxu 字体:[增加 减小] 来源:互联网 时间:2017-05-11

Jaxu通过本文主要向大家介绍了mongodb aggregate,aggregate,aggregate是什么意思,aggregate函数,aggregate demand等相关知识,希望本文的分享对您有所帮助

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)。

aggregate() 方法

MongoDB中聚合的方法使用aggregate()。

语法

aggregate() 方法的基本语法格式如下所示:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
</div>

我们知道,MongoDB属于文档型数据库,其存储的文档类型都是JSON对象。正是由于这一特性,我们在Node.js中会经常使用MongoDB进行数据的存取。但由于Node.js是异步执行的,这就导致我们无法保证每一次的数据库save操作都是原子型的。也就是说,如果客户端连续两次发起同一事件将数据存入数据库,很可能会导致数据被重复保存。高并发的情况下,哪怕是你在代码中已经做了非常严格的校验,例如插入数据前判断要保存的数据是否已经存在,但仍然有可能会出现数据被重复保存的风险。因为在异步执行中,你没有办法保证哪个线程先执行,哪个线程后执行,客户端发起的所有请求并非按我们想象的都是顺序执行的。一个较好的解决办法是在Mongo数据库的所有表中创建唯一索引。事实上,MongoDB默认会为所有表创建一个_id字段的唯一索引(可以取消)。如果你想在Node.js中通过mongoose.schema来自动创建索引,可以参考下面的代码:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var customerSchema = new mongoose.Schema({
cname: String,
cellPhone, String,
sender: String,
tag: String,
behaviour: Number,
createTime: {
type: Date,
default: Date.now
},
current:{
type: Boolean,
default: true
}
}, {
versionKey: false
});
customerSchema.index({cname:1,cellPhone:1,sender:1,tag:1,behaviour:1}, {unique: true});module.exports = mongoose.model('customer', customerSchema); 
</div>

  上面的model中我们定义了表customer的结构,并通过index()方法在字段cname,cellPhone,sender,tag,behaviour上创建了唯一索引,这样当包含这些字段的重复数据被插入时,数据库会抛出异常。借用mongoose,如果数据库表之前已经被创建并且程序正在运行中,当我们修改model并添加索引,然后重新启动app,只要有对该model的访问,mongoose会自动进行检测并创建索引。当然,如果数据出现重复,则索引创建会失败。此时我们可以通过在创建索引时添加dropDups选项,让数据库自动将重复的数据删除,如:

customerSchema.index({cname:1,cellPhone:1,sender:1,tag:1,behaviour:1}, {unique: true, dropDups: true});
</div>

  不过据MongoDB的官方说明,自3.0以后的版本不再使用该选项,而且也并没有提供替代的解决办法。貌似官方不再提供创建索引时自动删除重复记录的功能。那如何才能快速有效地找出重复的记录并且删除呢?首先我们要找出这些记录,然后通过remove()方法进行删除。下面的查询语句可以找出给定字段有重复数据的记录:

db.collection.aggregate([
{ $group: { 
_id: { firstField: "$firstField", secondField: "$secondField" }, 
uniqueIds: { $addToSet: "$_id" },
count: { $sum: 1 } 
}}, 
{ $match: { 
count: { $gt: 1 } 
}}
]) 
</div>

  替换_id属性的值以指定你想要进行判断的字段。相应地,在Node.js中代码如下:

var deferred = Q.defer();
var group = { firstField: "$firstField", secondField: "$secondField"};
model.aggregate().group({
_id: group,
uniqueIds: {$addToSet: '$_id'},
count: {$sum: 1}
}).match({ count: {$gt: 1}}).exec(deferred.makeNodeResolver());
return deferred.promise; 
</div>

上述代码使用了Q来替换函数执行中的回调。在Node.js的异步编程中,使用Q来处理回调是个不错的选择。

  下面是返回的结果:

/* 1 */
{
"result" : [ 
{
"_id" : {
"cellPhone" : "15827577345",
"actId" : ObjectId("5694565fa50fea7705f01789")
},
"uniqueIds" : [ 
ObjectId("569b5d03b3d206f709f97685"), 
ObjectId("569b5d01b3d206f709f97684")
],
"count" : 2.0000000000000000
}, 
{
"_id" : {
"cellPhone" : "18171282716",
"actId" : ObjectId("566b0d8dc02f61ae18e68e48")
},
"uniqueIds" : [ 
ObjectId("566d16e6cf86d12d1abcee8b"), 
ObjectId("566d16e6cf86d12d1abcee8a")
],
"count" : 2.0000000000000000
}
],
"ok" : 1.0000000000000000
}
</div>

  从结果中可以看到,一共有两组数据相同的记录,所以返回的result数组的长度为2。uniqueIds属性为一个数组,其中存放了重复记录的_id字段的值,通过该值我们可以使用remove()方法来查找并删除对应的数据。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • MongoDB aggregate 运用篇个人总结
  • 使用aggregate在MongoDB中查询重复数据记录的方法

相关文章

  • 2017-05-11MongoDB分片测试
  • 2017-05-11mongodb权限设置之添加管理员、普通用户的方法
  • 2017-05-11MongoDB系列教程(八):GridFS存储详解
  • 2017-05-11MongoDB中强大的统计框架Aggregation使用实例解析
  • 2017-09-02Mongo集群搭建
  • 2017-05-11Linux系统下MongoDB的简单安装与基本操作
  • 2017-05-11mongodb 命令行下及php中insert数据详解
  • 2017-05-11MongoDB入门教程之常用的运维技术介绍
  • 2017-05-11centos6.5中安装mongodb简明总结
  • 2017-05-11MongoDB远程访问配置步骤详解

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • MongoDB数据库forEach循环遍历用法
    • 详解MongoDB中用sharding将副本集分配至服务器集群的方法
    • 阿里云CentOS7安装Mongodb教程
    • CentOS 6.4创建Mongodb副本集
    • MongoDB中的MapReduce简介
    • MongoDB教程之数据操作实例
    • MongoDB与MySQL常用操作语句对照
    • MongoDB下根据数组大小进行查询的方法
    • 利用mongodb查询某坐标是否在规定多边形区域内的方法
    • MongoDB 游标详解及实例代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有