mongodb findOneAndUpdate 只获取更新的字段

Posted

技术标签:

【中文标题】mongodb findOneAndUpdate 只获取更新的字段【英文标题】:mongodb findOneAndUpdate get only updated fields 【发布时间】:2019-02-20 06:35:07 【问题描述】:

我正在使用mongodb 在某个集合中插入和更新一些文档。当我更新文档时,我只想获取修改后的字段。我可以通过使用 returnOriginal 选项进行更新来获取完整的新文档(包括修改的字段),但它提供了所有属性。

来自docs:

返回原件 |可选 |为 false 时,返回更新后的文档 而不是原来的。默认为真

我的代码是:

let result = await db.myCollection.findOneAndUpdate(
        _id: ObjectId('5a2451399054bf000453c332'), 
        data,
        returnOriginal: true
    );

其中data可以是一个字段,也可以是多个字段,例如:

let data = field1: 'newValue1';

let data = field1: 'newValue1', field2: 'newValue2';

我只想获取这些字段,但更新的结果是给了我整个对象,包括 _id 属性和所有其他属性,即使它们没有被修改。

我正在寻找的是一种简单的方法(mongodb 函数或属性将是理想的)仅获取修改后的字段,如果有这种方法,而不是比较两个对象(之前和之后)。

使用mongodb node driver:

"mongodb": "^3.1.6"

【问题讨论】:

遗憾的是,MongoDB 没有这样的功能,您需要使用 lodash 之类的实用程序库进行比较或编写自己的自定义函数来检查前后文档 【参考方案1】:

你可以这样做

为您传递的键创建一个键值对,其值等于 1 以用于投影。

var keys = 
let data =  field1: 'newValue1', field2: 'newValue2' 
function setUsers(data) 
  for (var k in data) 
    if (data.hasOwnProperty(k)) 
      keys[k] = 1
    
  
  return keys

const projection = setUsers(data)

然后在查询中使用投影来限制字段

db.myCollection.findOneAndUpdate(
   _id: ObjectId('5a2451399054bf000453c332') , 
  data,
   returnOriginal: true, projection 
)

【讨论】:

是的,这是我目前的方法,但希望 mongodb 有一个本机选项或功能可以做到这一点。这个解决方案唯一的问题是它对嵌套属性、对象或数组没有帮助,但当然这是我之前已经解决的解决方案。谢谢! 好吧,chridam 是对的,现在 mongodb 中没有可用的功能。

以上是关于mongodb findOneAndUpdate 只获取更新的字段的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - Mongoose 查询 findOneAndUpdate() 不更新/复制数据库

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]

findOneAndUpdate 未在 MongoDb 中返回更新的文档 [重复]

如何在 mongodb 的 findOneAndUpdate 中使用对象作为过滤器

MongoDB findOneAndUpdate 返回 null

MongoDB findOneAndUpdate 返回 null