0

所以我收集了一些看起来像这样的动物:

{ "collection":
  [
      {   "name":"cow",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"sheep",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"goat",
      "parts": [
          {"part_name":"legs"},
          {"part_name":"rumen"},
          {"part_name":"tail"},
          {"part_name":"nostrils"}
      ]
      },
      {   "name":"dog",
      "parts": [
          {"part_name":"ears"},
          {"part_name":"nipples"},
          {"part_name":"legs"},
          {"part_name":"nostrils"}
      ]
      }
  ]
}

我不喜欢part_name“rumen”,所以我想写一个delete语句,只删除值为“rumen”的嵌套字段,即:

delete from animals where parts.part_name = 'rumen';

但这不是解决问题的方法。我如何实现这一目标?

编辑:动物表解释(部分是重复字段):

|   animal_name   |            parts.part_name           |
+-----------------+--------------------------------------+
|       cow       |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+
|      sheep      |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostril              |
+-----------------+--------------------------------------+
|       goat      |                  legs                |
|                 |                  rumen               |
|                 |                  tail                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+
|        dog      |                  ears                |
|                 |                 nipples              |
|                 |                  legs                |
|                 |                 nostrils             |
+-----------------+--------------------------------------+
4

1 回答 1

1

您不能delete嵌套字段。您可以做的是update所有rumen具有新数组值的记录,不包括rumen. 我不太确定您的架构,但应该是这样的

update tmp.collection c
-- assign new array value, for which we select everything but 'rumen'.
set parts = array(select * from c.parts where part_name <> 'rumen')
-- we only care about the rows that have 'rumen' in the first place.
where exists (select 1 from c.parts where part_name = 'rumen');
于 2020-03-09T05:13:51.997 回答