小编Haf*_*fez的帖子

MongoDB更新子文档更改其_id

我有下一个文档,我想更新 id 为 21 的地址,将别名更改为“Family”。我跑User.update({ _id: 2, 'addresses._id': 21 }, { 'addresses.$': newAddress });

效果很好,但有一个恼人的副作用,那就是 Mongo 会为子文档生成一个新的 id。有没有办法在不获取新ID的情况下更新子文档?

'user': {
  '_id': 2,
  'addresses': [
    {
      '_id': '20',
      'alias': 'Work',
      'postal_code': 1235
    },
    {
      '_id': '21',
      'alias': 'Home',
      'postal_code': 1235
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我已经使用解决了这个问题

User.update(
  { _id: req.user._id, 'addresses._id': addressId },
  { $set: {
    'addresses.$.alias': newAddress.alias,
    'addresses.$.address': newAddress.address,
    'addresses.$.areaId': newAddress.areaId,
    'addresses.$.cityId': newAddress.cityId,
    'addresses.$.postal_code': newAddress.postal_code
  } }
);
Run Code Online (Sandbox Code Playgroud)

这不会更改子文档的 id,但出于明显的原因我不喜欢这个解决方案。

mongoose mongodb node.js

6
推荐指数
1
解决办法
3194
查看次数

MongoDB检查存在计数与findOne性能

我试图找出我的数据库中是否存在文档,并且我很好奇,这样做的最佳方法是什么?使用

User.findOne(query).select('_id')

要么

User.count(query)

一方面,findOne返回一个24进制的字符串,而count仅返回一个整数;另一方面,.count它将遍历整个集合,而.findOne将在第一个匹配的文档处停止。

我找到的与问题相关的唯一答案是这个问题,找不到其他答案,这个答案得到了支持.count,Mongo在性能方面做了很多工作,这个问题是6年前的。

什么更有价值?内存(findOne)或处理能力(计数)?

mongodb database-performance

4
推荐指数
1
解决办法
1010
查看次数

MongoDB 批量写入多个 updateOne 与 updateMany

我在某些情况下构建了 bulkWrite 操作,其中某些文档具有相同的update对象,合并过滤器并updateMany使用这些过滤器发送一个而不是多个updateOnes是否有任何性能优势bulkWrite

使用普通方法时,使用updateMany多个updateOnes显然更好,但是对于bulkWrite,因为它是一个命令,所以选择一个比另一个更重要吗?

例子:

我有 20 万个文档需要更新,status所有 20 万个文档总共有 10 个唯一字段,所以我的选项是:

解决方案:

A)发送一个包含 10 个updateMany操作的单个 bulkWrite ,这些操作中的每一个都会影响 20K 文档。

B)发送一个带有 200K 的单个 bulkWrite,updateOne每个操作保存其过滤器和status.

正如@AlexBlex 指出的那样,我必须注意使用相同的过滤器意外更新多个文档,在我的情况下,我_id用作我的过滤器,因此意外更新其他文档在我的情况下不是问题,但绝对值得一看在考虑updateMany选项时。

谢谢@AlexBlex。

mongodb database-performance

4
推荐指数
2
解决办法
1300
查看次数

标签 统计

mongodb ×3

database-performance ×2

mongoose ×1

node.js ×1