mongodb 通过从基于对象字段的对象字段数组中删除元素来更新文档

uqxowvwt  于 2022-11-28  发布在  Go
关注(0)|答案(1)|浏览(113)

我收藏了很多文件

[
  {
    a: 1,
    b: 1,
    c: [
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc1",
          CBB: "abcd",
          CBC: "ancdf",
        },
      },
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc2",
          CBB: "abcd1",
          CBC: "ancdf2",
        },
      },
    ],
  },
  {
    a: 1,
    b: 1,
    c: [
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc3",
          CBB: "abcd3",
          CBC: "ancdf3",
        },
      },
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc2",
          CBB: "abcd1",
          CBC: "ancdf2",
        },
      },
    ],
  },
  {
    a: 1,
    b: 1,
    c: [
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc4",
          CBB: "abcd4",
          CBC: "ancdf4",
        },
      },
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc24",
          CBB: "abcd5",
          CBC: "ancd6",
        },
      },
    ],
  },
  {
    a: 1,
    b: 1,
    c: [
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc1",
          CBB: "abcd",
          CBC: "ancdf",
        },
      },
      {
        cA1: "CA1",
        CB1: {
          CBA: "abc2",
          CBB: "abcd1",
          CBC: "ancdf2",
        },
      },
    ],
  },
];

我想做的是根据CB 1对象的字段值,删除匹配单据中字段c的元素。
我所做的是

const x = db.collection.updateMany(
  {},
  {
    $pull: {
      c: {
        $elemMatch: {
            CB1: {
            $in: [
              {
                CBA: "abc2",
                CBB: "abcd1",
              },
              {
                CBA: "abc1",
                CBB: "abcd",
              }
            ],
          },
        },
      },
    },
  },
  { multi: true }
);

它不起作用。我们要做的是从c中删除所有元素,其中CB 1具有数组中$中提到的值的字段。如果它确实不可能在该级别上使用**$中的**,逐个删除也将起作用。

bttbmeg0

bttbmeg01#

一个选项是:

db.collection.update(
  {c: {
    $elemMatch: {
      $or: [
        {"CB1.CBA": "abc2", "CB1.CBB": "abcd1"},
        {"CB1.CBA": "abc1", "CB1.CBB": "abcd"}
      ]
    }
  }},
  [
    {$set: {
      delete: {$size: {
          $filter: {
            input: "$c",
            cond: {
              $or: [
                {$and: [
                    {$eq: ["$$this.CB1.CBA", "abc1"]},
                    {$eq: ["$$this.CB1.CBB", "abcd"]}
                ]},
                {$and: [
                    {$eq: ["$$this.CB1.CBA", "abc2"]},
                    {$eq: ["$$this.CB1.CBB", "abcd1"]}
                ]}
              ]
            }
          }
      }}
    }},
    {$set: {c: {$cond: [{$eq: ["$delete", 2]}, [], "$c"]}, delete: "$$REMOVE"}}
  ],
  {multi: true}
)

了解它在playground example上的工作原理

相关问题