对于mongoose的

.findOneAndUpdate()或任何.findAndModify()核心驱动程序变体,实际的回调签名具有“三个”参数:

function(err,result,raw)

第一个是任何错误响应,然后修改或原始文档取决于选项,第三个是发布语句的写入结果.

第三个参数应该像这样返回数据:

{ lastErrorObject:

{ updatedExisting: false,n: 1,upserted: 55e12c65f6044f57c8e09a46 },value: { _id: 55e12c65f6044f57c8e09a46,number: 55555555,country: 'US',token: "XXX",appInstalled: true,__v: 0 },ok: 1 }

使用一致字段作为lastErrorObject.updatedExisting是true / false,具体取决于是否发生upsert的结果.请注意,当此属性为false时,还有一个“upserted”值包含新文档的_id响应,但是当它为true时不包含.id响应值.

因此,您将修改您的处理以考虑第三个条件,但这仅适用于回调而不是承诺:

InBox.model.findOneAndUpdate(

{ "number": req.phone.number },{

"$set": {

"country": req.phone.country,"token": hat(),"appInstalled": true

}

},{ "new": true,"upsert": true },function(err,doc,raw) {

if ( !raw.lastErrorObject.updatedExitsing ) {

// do things with the new document created

}

}

);

我强烈建议你在这里使用update operators而不是原始对象,因为原始对象将始终覆盖整个文档,但像$set这样的运算符只会影响列出的字段.

还注意到语句的任何匹配“查询参数”都会在新文档中自动分配,只要它们的值是未找到的完全匹配即可.

鉴于使用promise似乎没有出于某种原因返回附加信息,那么除了设置{new:false}之外的其他承诺并没有看到这是可能的,并且基本上当没有返回文档时它是新的.

无论如何,您都希望插入所有文档数据,因此不一定非常需要返回的数据.事实上,本机驱动程序方法在核心处理这个问题,并且只有在发生upsert时才会响应“upserted”_id值.

这真的归结为本网站讨论的另一个问题,在:

这实际上归结为在promise响应中解决多个对象,这在本地特征化中没有直接支持,但是那里列出了一些方法.

所以,如果你实现Bluebird promises并在那里使用.spread()方法,那么一切都很好:

var async = require('async'),Promise = require('bluebird'),mongoose = require('mongoose'),Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');

var testSchema = new Schema({

name: String

});

var Test = mongoose.model('Test',testSchema,'test');

Promise.promisifyAll(Test);

Promise.promisifyAll(Test.prototype);

async.series(

[

function(callback) {

Test.remove({},callback);

},function(callback) {

var promise = Test.findOneAndUpdateAsync(

{ "name": "Bill" },{ "$set": { "name": "Bill" } },"upsert": true }

);

promise.spread(function(doc,raw) {

console.log(doc);

console.log(raw);

if ( !raw.lastErrorObject.updatedExisting ) {

console.log( "new document" );

}

callback();

});

}

],function(err) {

if (err) throw err;

mongoose.disconnect();

}

);

当然,这会返回两个对象,然后您可以始终如一地访问:

{ _id: 55e14b7af6044f57c8e09a4e,name: 'Bill',__v: 0 }

{ lastErrorObject:

{ updatedExisting: false,upserted: 55e14b7af6044f57c8e09a4e },value: { _id: 55e14b7af6044f57c8e09a4e,ok: 1 }

以下是演示正常行为的完整列表:

var async = require('async'),'test');

async.series(

[

function(callback) {

Test.remove({},function(callback) {

Test.findOneAndUpdate(

{ "name": "Bill" },"upsert": true }

).then(function(doc,function(err) {

if (err) throw err;

mongoose.disconnect();

}

);

对于记录,本机驱动程序本身没有此问题,因为响应对象实际上是除了任何错误之外返回的唯一对象:

var async = require('async'),mongodb = require('mongodb'),MongoClient = mongodb.MongoClient;

MongoClient.connect('mongodb://localhost/test',db) {

var collection = db.collection('test');

collection.findOneAndUpdate(

{ "name": "Bill" },{ "upsert": true,"returnOriginal": false }

).then(function(response) {

console.log(response);

});

});

所以总是这样:

{ lastErrorObject:

{ updatedExisting: false,upserted: 55e13bcbf6044f57c8e09a4b },value: { _id: 55e13bcbf6044f57c8e09a4b,name: 'Bill' },ok: 1 }

php7 findandmodify,node.js – (mongoose / promises)如何检查文档是否是使用带有upsert的findOneAndUpdate创建的...相关推荐

  1. Node.js+Mongoose实现MondoDB操作

    1.MongoDB是什么,就是一个讲数据存储为类似JSON格式的NoSQL数据库,结构灵活. 2.Mongoose是什么,就是一个以对象形式来操作MongoDB存储的node.js库,ORM,非常方便 ...

  2. 如何在Mongoose中更新/更新文档?

    本文翻译自:How do I update/upsert a document in Mongoose? Perhaps it's the time, perhaps it's me drowning ...

  3. 【Auto.JS】Autojs官方提取文档使用说明函数 (2)

    接上一篇文章:Autojs官方提取文档使用说明函数 (1) Images Stability: 2 - Stable images模块提供了一些手机设备中常见的图片处理函数,包括截图.读写图片.图片剪 ...

  4. 自己用js做的在线word文档编辑器oarword-doc/docx文档编辑、导出导出

    分享自己用js做的在线word文档编辑器oarword 支持基本doc/docx文档编辑,导出和导出,类似google docs和zoho 源码分享在Github:https://github.com ...

  5. Word在试图打开文件时遇到错误。 请尝试下列方法: 检查文档或驱动器的文件权限。 确保有足够的内存和磁盘空间。 用文本恢复转换器打开文件。

    重新装office之后打开系统的文件提示: Word在试图打开文件时遇到错误. 请尝试下列方法: 检查文档或驱动器的文件权限. 确保有足够的内存和磁盘空间. 用文本恢复转换器打开文件. 1.文件安全性 ...

  6. Word在试图打开文件时遇到错误,请尝试下列方法:检查文档或驱动器的文件权限 确保有足够的内存和磁盘空间 用文本恢器打开文件

    Word在试图打开文件时遇到错误,请尝试下列方法:检查文档或驱动器的文件权限 确保有足够的内存和磁盘空间 用文本恢器打开文件  . 经常在浏览器上直接下载的文档打开就报这个错,也不知道是什么原因,最后 ...

  7. “Word在试图打开文件时遇到错误。请尝试下列方法:* 检查文档或驱动器的文件权限。* 确保有足够的内存和磁盘空间。* 用文件恢复转换器打开文件。”问题!...

    Word在试图打开文件时遇到错误. 请尝试下列方法: * 检查文档或驱动器的文件权限. * 确保有足够的内存和磁盘空间. * 用文件恢复转换器打开文件. 如下图: 让同事在他们自己电脑上,都是可以打开 ...

  8. 基于 next.js + mdx 搭建组件库文档项目(二) -- mdx 控件封装实现组件的演示与 Props 列表

    说明 经过上阶段的配置虽然可以在项目中使用 mdx 语法 来创建页面了,但是我们的组件库有一些定制化的需求:交互式的组件演示.组件 Props 列表展示.这些功能如果可以通过封装来实现,会大大提升开发 ...

  9. 基于 next.js + mdx 搭建组件库文档项目(一) -- 开发环境搭建

    说明 之前使用过 Docz 来作为组件库文档搭建工具,它基于 gatsby , 提供了高度的定制化能力,但是截止 2021-06-22, Docz 停留在 v2.3.1(2020-04-05) 已经一 ...

最新文章

  1. QT的QScopedPointer类的使用
  2. “请先做自我介绍”:高手都是这样做自我介绍,这样介绍最加分
  3. http://jingyan.baidu.com/article/fcb5aff78e6a48edab4a7146.html
  4. JWT-JSON WEB TOKEN使用详解及注意事项
  5. 电商小程序如何实现分账?
  6. linux不识别指纹仪,ubuntu t43指纹仪安装
  7. matlab 曲线填充 透明度
  8. maven学习笔记【二】私服Nexus
  9. 寻找美好,不如创造美好
  10. 基于vs实现的socket—udp图片传送实例详解
  11. 计算机电脑显卡基础知识,基础电脑显卡知识,你还不知道吗?别再被坑了!
  12. 记一次 RestfulToolkit-fix 插件下载,导致idea启动报错
  13. 前端跨域问题汇总及解决方案
  14. 性能测试的需求分析,性能测试的必要性
  15. 医惠护理系统服务器错误,医惠移动护理信息系统标准接口文档
  16. 暴风影音打开文件连接服务器失败,常见问题:解决暴风影音播放问题
  17. 2021-03-27 Python根据vasp-dos数据绘制曲线并计算d带中心
  18. 福利| 一台电脑,双网卡,三个IP地址,如何同时工作
  19. cAdvisor的安装与使用
  20. 默默无闻七年 最终成就一个优秀的IT人

热门文章

  1. Android Sqlite3数据库操作
  2. python画反比例函数_反比例光滑支撑向量机
  3. java中map函数指针_如何用Rust编写合适的map函数?
  4. sp许可证查询 旧sp电信经营许可证查询 电信业务
  5. Java中list操作
  6. 进阶04 4 Collection集合类+Iterator迭代器+增强for+泛型
  7. Android Studio实现一个新闻APP
  8. 做人做事,就两个字!
  9. php 验证码功能的实现原理,php验证码实现原理
  10. django view返回form error_Django(解决被钓鱼CSRF、Django中间件、反射)