比如下面这个voteResults字段,我投票opt1时,就把opt1下面的cnt字段加1;投票opt1和opt3时(多选)就同时把他们两个下面的cnt字段再加1。

"voteResults": [
    {
        "opt1": "第一",
        "cnt": 0
    },
    {
        "opt2": "第二",
        "cnt": 0
    },
    {
        "opt3": "第三",
        "cnt": 0
    },
    {
        "opt4": "第四",
        "cnt": 0
    }
]

"voteResults":{"__op":"Increment","amount":1} 这句查询参数是,针对基本类型的,比如"voteResults":0,值为Number型0。
那么上面这种数组里面又是对象如何操作字段 cnt 的数量增减?

原子增减只能应用于数字类型的字段,对于这种嵌套在数组和对象里面的数字是不适用的。

这里提供另外一种设计思路:可以新建一个 Class 专门用来存储投票结果。在这个 Class 中,对每一个问题的每一个选项创建一个对象,这样每个对象就会有下面这三个字段:

  1. 问题(可以从原本 voteResults 所属的 Class 中删掉 voteResults 字段,这样这个 Class 就专门用来存储问题,然后新的 Class 这边的问题字段可以设置成指向原 Class 的 Pointer)
  2. 选项(String)
  3. 票数(Number)

后续就可以对于这些对象的票数进行原子增减了。

改成 设置旧表中的Q字段(删除上面旧表的voteResults字段后新增的一个字段)为字符串类型,值为问题。
然后建一个新表,旧表问题的答案选项有几个(比如3个)就在新表添加几个(3个)字段,每个字段是对象,对象里面有3个字段如下:

{
  "问题字段":point指向旧表的objectId,
  "选项字段":值为字符串类型,
  "票数字段":值为Number类型
}

是这样吗?
这样的话也是操作对象里面的属性obj.num,能原子增减嘛(而且新表的每个选项字段都在关联旧表虽然不影响,但是选项数量和名不固定,新表会增加很多字段)

放在对象字段里面的字段也是不能进行原子增减的。我前面提出的方案是为每个选项创建一个 Class 中的对象(而非某个对象的字段),然后给这个选项对象分配三个字段,这样其中的票数字段就能实现原子增减了。

陈师傅 我隔了一晚还是没看懂您的这句话,(为每个选项创建一个 Class 中的对象)太抽象了。

求求您举个栗子:
比如我的投票问题是question:Q,
选项答案opt1:A
选项答案opt2:B
选项答案opt3:C
表(class)1为Vote,表2为Result,各表里面的字段和关系如何设置?

Vote 表:

| objectId | question (String) |
| -------- | ----------------- |
| 0000     | Question 1        |
| 0001     | Question 2        |

Result 表:

| objectId | question (Pointer) | option (String)     | count (Number) |
| -------- | ------------------ | ------------------- | -------------- |
| aaaa     | 0000               | Question 1 Option A | 1              |
| aaab     | 0000               | Question 1 Option B | 2              |
| aaac     | 0001               | Question 2 Option A | 4              |
| aaad     | 0001               | Question 2 Option B | 8              |

这样是看懂了。
Vote表除了id列,其他列字段都存问题,值为对应问题的选项。
那产出的第2个投票问题怎么放呢,不可能放Vote表的第3列吧 这样第2次投票问题和第一次问题的id在同一行是一样的了

Vote 表中的每一行是一个问题,每一个字段表示这个问题的一个属性。不需要为每个问题增加字段。

我刚试了,那不能一次性一个接口搞定呀,比如批量接口,因为新建第二个表设置关联需要第一个表的id,所以第一个问题表的创建和第二个结果表的创建不能同时,得分2次调用接口