当前位置: 首页 > news >正文

淘宝刷单网站开发网上商城 网站

淘宝刷单网站开发,网上商城 网站,织梦模板建站,wordpress 评论 沙发我们知道#xff0c;MongoDB属于文档型数据库#xff0c;其存储的文档类型都是JSON对象。正是由于这一特性#xff0c;我们在Node.js中会经常使用MongoDB进行数据的存取。但由于Node.js是异步执行的#xff0c;这就导致我们无法保证每一次的数据库save操作都是原子型的。也…  我们知道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); 上面的model中我们定义了表customer的结构并通过index()方法在字段cnamecellPhonesendertagbehaviour上创建了唯一索引这样当包含这些字段的重复数据被插入时数据库会抛出异常。借用mongoose如果数据库表之前已经被创建并且程序正在运行中当我们修改model并添加索引然后重新启动app只要有对该model的访问mongoose会自动进行检测并创建索引。当然如果数据出现重复则索引创建会失败。此时我们可以通过在创建索引时添加dropDups选项让数据库自动将重复的数据删除如 customerSchema.index({cname:1,cellPhone:1,sender:1,tag:1,behaviour:1}, {unique: true, dropDups: true}); 不过据MongoDB的官方说明自3.0以后的版本不再使用该选项而且也并没有提供替代的解决办法。貌似官方不再提供创建索引时自动删除重复记录的功能。那如何才能快速有效地找出重复的记录并且删除呢首先我们要找出这些记录然后通过remove()方法进行删除。下面的查询语句可以找出给定字段有重复数据的记录 db.collection.aggregate([ { $group: { _id: { firstField: $firstField, secondField: $secondField }, uniqueIds: { $addToSet: $_id }, count: { $sum: 1 } }}, { $match: { count: { $gt: 1 } }} ]) 替换_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; 上述代码使用了Q来替换函数执行中的回调。在Node.js的异步编程中使用Q来处理回调是个不错的选择。 下面是返回的结果 /* 1 */ { result : [ { _id : { cellPhone : 15827571111, actId : ObjectId(5694565fa50fea7705f01789) }, uniqueIds : [ ObjectId(569b5d03b3d206f709f97685), ObjectId(569b5d01b3d206f709f97684) ], count : 2.0000000000000000 }, { _id : { cellPhone : 18171282222, actId : ObjectId(566b0d8dc02f61ae18e68e48) }, uniqueIds : [ ObjectId(566d16e6cf86d12d1abcee8b), ObjectId(566d16e6cf86d12d1abcee8a) ], count : 2.0000000000000000 } ], ok : 1.0000000000000000 } 从结果中可以看到一共有两组数据相同的记录所以返回的result数组的长度为2。uniqueIds属性为一个数组其中存放了重复记录的_id字段的值通过该值我们可以使用remove()方法来查找并删除对应的数据。 补充Mongoose支持findOneAndUpdate在MongoDB中对应的方法叫findAndModify选项upserttrue表示当要要更新的数据不存在时会自动创建。该选项默认值为false。示例代码如下 var query {username:req.user.username}; req.newData.username req.user.username; MyModel.findOneAndUpdate(query, req.newData, {upsert:true}, function(err, doc){ if (err) return res.send(500, { error: err }); return res.send(succesfully saved); }); 通过该方法我们可以将数据的唯一性校验交给MongoDB来完成。 更多专业前端知识请上 【猿2048】www.mk2048.com
http://wiki.neutronadmin.com/news/395018/

相关文章:

  • 深圳设计公司企业网站上海市电话黄页本
  • 2019网站怎么做如何在手机上做广告
  • 多个网站 备案吗wordpress5.0.2图集怎么发布
  • 东莞网站排名推广企业网站建设如何选择网络公司
  • 焦作建网站wordpress实时刷新模块
  • 个人 可以做网站备案吗WordPress免插件实现QQ咨询
  • 宁夏建设监理协会网站用付费网站做推广
  • 现在做什么个人网站好linux 国外网站
  • 凤岗网站建设微信运营商电话
  • 如何判断网站做没做404北京 做网站
  • asp.net 网站图标做二手车网站怎么做的
  • 打电话来说做网站 然后答应了怎么建设游网站主页
  • 重庆网站仿站手机建站系统
  • 昆山网站制作哪家好中信建设有限责任公司刚果金
  • 免费建站的方法流程怎么让别人做网站
  • 在国外服务器上做网站项目如何赚钱好用的代码网站
  • 网站设计可以在手机上做吗wordpress 500 - 内部服务器错误
  • 完成网站开发需要什么样技术vs2010网站设计用整张图片做背景
  • 建设外贸网站费用智慧团建手机登录端口
  • 网站seo收录工具wordpress 占用cpu
  • 许昌建设局网站google推广方式和手段有哪些
  • 网站取消备案免费的宣传方式
  • 先用ps后用dw做网站wordpress 主题 主机
  • 做企业网站需要资质吗用nas做网站
  • .net 网站 源代码长春的网站建设
  • 快速网站推广做网站业务员怎么样
  • 如何制作一般企业网站蔬菜配送网站建设
  • 网站开发费计入什么科目国内免费建站网站
  • 如何制作一个静态网站源码wordpress pot
  • 桐城市网站建设easyphp搭建wordpress