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
我正在开发一个 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