我正在做查询更新数据库MongoDB. 例如,我在集合product中有六个Item对象(我的实际数据很多):

{
    _id: ObjectId('1232'),
    title: 'Product 1',
    order: 1,
    code: 'A',
    status: 'active'
}
{
    _id: ObjectId('4444'),
    title: 'Product 2',
    order: 2,
    code: 'B',
    status: 'active'
}
{
    _id: ObjectId('2232'),
    title: 'Product 3',
    order: 3,
    code: 'A'
    status: 'unActive'
}
{
    _id: ObjectId('55555'),
    title: 'Product 4',
    order: 4,
    code: 'C',
    status: 'active'
}
{
    _id: ObjectId('66666'),
    title: 'Product 5',
    order: 5,
    code: 'D',
    status: 'active'
}
{
    _id: ObjectId('2222'),
    title: 'Product 6',
    order: 6,
    code: 'C',
    status: 'active'
}

现在,我想使用Query更新code:

  • 如果是status = active.
  • 如果是code = A,它将被替换为A1.
  • 如果code = B=>B1.
  • 如果code = C=>C1.
  • 如果code = D=>D1

下面是我提出的问题:

db.getCollection('product').updateMany({'code': 'A'}, {$set: {'code': 'A1'}})

但我只能用WHERE条件替换.如何使用AND Where或Where更改code的值.请给我您的意见,这样我才能解决这个问题.谢谢.我是MongoDB的新手,所以我过得很艰难.希望大家都能理解.

推荐答案

您可以将聚合管道与MongoDB更新结合使用.您可以在docs中找到条件更新WITH $switch语句的示例

db.getCollection('product').updateMany({status:'active'}, [
     { $set: { code: { $switch: {
                           branches: [
                               { case: { $eq: [ "$code", "A"] }, then: "A1" },
                               { case: { $eq: [ "$code", "B"] }, then: "B1" },
                               { case: { $eq: [ "$code", "C"] }, then: "C1" },
                               { case: { $eq: [ "$code", "D"] }, then: "D1" }
                           ],
                           default: ""  //can remove if switch satisfy at least 1 condition above
     } } } }
])

playground

Mongodb相关问答推荐

MongoDB Aggregate:查找每个月的交叉日期范围的数量

如何将数组$拉到对象数组下

GO:如何在MongoDB中区分空字符串和nil

Mongo Aggregate管道-另一个集合中的多个查找

MongoDB Aggregate 根据时间进行多重分组

如何在mongoDB中按嵌套文档分组( group by )

MongoID find 或 find_by

如何在 Mongo 聚合中合并文档中的数组字段

聚合/元素子文档作为 mongo 中的顶级文档

返回从循环中调用的数据库查询中检索到的数据的问题

MongoDB $或PHP中的查询

Mongo DB中的Upserting和Id问题

无法从 MongoDb C# 中的 BsonType ObjectId 反序列化字符串

如何确保基于特定字段的数组中的唯一项 - mongoDB?

docker 在不同的端口上运行 mongo 映像

没有参考选项的mongoose填充字段

从 mongo 结果中删除 _id

判断字段是否存在于数组的子文档中

使用 Mongoose ORM 的杀手锏是什么?

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小