mongodb Mongoose使用$或条件更新文档

3htmauhk  于 2023-01-08  发布在  Go
关注(0)|答案(2)|浏览(139)

我想搜索具有相同action_object.reply.idaction_target.reply.id的所有活动。类似于以下内容:

Activity
  .find({ $or: [
    { 'action_object.reply.id': replyId }, 
    { 'action_target.reply.id': replyId }
  ]});

但是我也只想像这样更新removed属性:

Activity
  .update({ 'action_object.reply.id': replyId }, {
            'action_object.reply.removed': true }, { multi: true });

Activity
      .update({ 'action_target.reply.id': replyId }, {
                'action_target.reply.removed': true }, { multi: true });

有没有可能把这两个查询组合起来呢?我想更新action_target.reply.removed where action_target.reply.idaction_object.reply.removed where action_object.reply.id
或者我必须像上面那样为此编写两个不同的查询。

fhg3lkii

fhg3lkii1#

update调用的第一个参数是query对象,因此您可以简单地使用相同的$或query,Mongo将更新查询检索到的所有文档。

Activity
  .update({ $or: [
    { 'action_object.reply.id': replyId }, 
    { 'action_target.reply.id': replyId }
  ]}, {'action_object.reply.removed': true }, { multi: true });
3vpjnl9f

3vpjnl9f2#

对于4.2,您可以使用$cond

// Configuration
[
  {
    "action_object": {
      "reply": {
        "id": "bar",
        "removed": false
      }
    }
  },
  {
    "action_target": {
      "reply": {
        "id": "foo",
        "removed": false
      }
    }
  }
]

// Query
db.collection.update({
  $or: [
    {
      "action_object.reply.id": "foo"
    },
    {
      "action_target.reply.id": "foo"
    }
  ]
},
[
  {
    $set: {
      "action_object.reply.removed": {
        $cond: [
          {
            $eq: [
              "foo",
              "$action_object.reply.id"
            ]
          },
          true,
          "$$REMOVE"
        ]
      },
      "action_target.reply.removed": {
        $cond: [
          {
            $eq: [
              "foo",
              "$action_target.reply.id"
            ]
          },
          true,
          "$$REMOVE"
        ]
      }
    }
  }
],
{
  multi: true
})

https://mongoplayground.net/p/tOLh5YKRVX1

相关问题