Couchbaselite 更改更改 returns 所有对象,即使只更改了一个文档

Couchbaselite change Changes returns all objects even though only one document was changed

我正在开发一个 couchbase lite 驱动的应用程序,并尝试根据来自 couchbase mobile lite 的 help 进行实时查询。

虽然它有效,但我对报告为已更改的文档数量感到困惑。这只在我的笔记本电脑上,所以我通过 cbimport 将 json 文件上传到 couchbase 服务器。然后同步网关确实将所有数据成功同步到我的 android 应用程序。

现在,我更改了 couchbase 服务器中的一个文档,但所有 27 个文档都在实时查询中返回为已更改。我只希望返回自上次同步以来更改过的文档。

查看每个文档的元信息,我修改的文档有以下内容:

{
  "meta": {
    "id": "Group_2404_159_5053",
    "rev": "15-16148876737400000000000002000006",
    "expiration": 0,
    "flags": 33554438,
    "type": "json"
  },
  "xattrs": {
    "_sync": {
      "rev": "7-ad618346393fa2490359555e9c889876",
      "sequence": 2951,
      "recent_sequences": [
        2910,
        2946,
        2947,
        2948,
        2949,
        2950,
        2951
      ],
      "history": {
        "revs": [
          "3-89bb125a9bb1f5e8108a6570ffb31821",
          "4-71480618242841447402418fa1831968",
          "5-4c4d990af34fa3f53237c3faafa85843",
          "1-4fbb4708f69d8a6cda4f9c38a1aa9570",
          "6-f43462023f82a12170f31aed879aecb2",
          "7-ad618346393fa2490359555e9c889876",
          "2-cf80ca212a3279e4fc01ef6ab6084bc9"
        ],
        "parents": [
          6,
          0,
          1,
          -1,
          2,
          4,
          3
        ],
        "channels": [
          null,
          null,
          null,
          null,
          null,
          null,
          null
        ]
      },
      "cas": "0x0000747376881416",
      "value_crc32c": "0x8c664755",
      "time_saved": "2020-06-01T14:23:30.669338-07:00"
    }
  }
}

而其余 26 个文档与此类似:

{
  "meta": {
    "id": "Group_2404_159_5087",
    "rev": "2-161344efd90c00000000000002000006",
    "expiration": 0,
    "flags": 33554438,
    "type": "json"
  },
  "xattrs": {
    "_sync": {
      "rev": "1-577011ccb4ce61c69507ba44985ca038",
      "sequence": 2934,
      "recent_sequences": [
        2934
      ],
      "history": {
        "revs": [
          "1-577011ccb4ce61c69507ba44985ca038"
        ],
        "parents": [
          -1
        ],
        "channels": [
          null
        ]
      },
      "cas": "0x00000cd9ef441316",
      "value_crc32c": "0xc37bb792",
      "time_saved": "2020-05-28T11:34:50.3200745-07:00"
    }
  }
}

这是预期的行为还是我可以做些什么?

该行为符合预期。每次发生影响查询结果的数据库更改时,实时查询都会重新运行查询。因此,在您的情况下,由于它是一个获取数据库中所有文档的查询,因此当数据库中的任何文档发生更改并且它 returns 所有文档(这就是查询的目的)时,查询都会重新运行。

如果您的查询有过滤谓词,则最适合使用实时查询。例如,如果应用程序希望在“foo”类型文档中的状态字段发生变化时收到通知。在这种情况下,只有当状态字段在“foo”类型的文档中发生变化时,您才会收到通知。

在您的情况下,如果您只关心数据库中的任何文档发生变化时的变化,您应该只使用 Database Change Listener