cosmos-db-where-condition-by-external文档

cidc1ykv  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(352)

我有一个如下的文档结构(省略所有带有下划线前缀的文档,如\u self)

{
    "id": "c5055e2b-efb2-4c86-907d-a0beb1dca4dc",
    "Name": "John Johnson",
    "partitionKey": "0ecdb989-01c6-4f11-9fd2-3e1dcc1c8cb9",
    "FKToBeDeleted": "FK_c5055e2b-efb2-4c86-907d-a0beb1dca4dc_ToBeDeleted",
}

如您所见,有一个字段名为 FKToBeDeleted 我用它来标记文档,但它必须作为一个参考,因为在我的应用程序中可能会发生某种数据库并发,因为第一个应用程序可以获取文档,处理它,第二个应用程序可以在处理过程中更新文档,第一个应用程序不会看到任何更改,因为再次下载巨大的文档并更新它是非常耗时的,所以我想降低成本。更进一步,我为此创建了一个文档。

{
    "id": "FK_c5055e2b-efb2-4c86-907d-a0beb1dca4dc_ToBeDeleted",
    "partitionKey": "0ecdb989-01c6-4f11-9fd2-3e1dcc1c8cb9",
    "ToBeDeleted": false,
}

现在出现了一个问题,因为我的前端应用程序不想显示任何 ToBeDeleted 文件。这有点欺骗用户,因为我只是将其标记为已删除,但稍后会删除文档。
现在的问题是sql查询应该是什么样子?以前它类似于下面的查询,因为r.tobedeleted是布尔的。

SELECT r.id, r.Name, r.AddedAt, r._ts
FROM ROOT r 
WHERE 
(NOT(r.ToBeDeleted)) 
ORDER BY r.AddedAt desc

现在 FKToBeDeleted 只是对另一个文档的引用,但id位于 r.FKToBeDeleted ,所以我尝试了一些嵌套的select,但没有成功。
有什么建议吗?正确的方法是什么?
编辑(澄清)

我们来看看下面的情况。有两个应用程序(您也可以将它们视为线程)使用相同的cosmos db示例。
第1步-是开始处理一些数据的时刻,但是需要数据库文档,所以它得到了这个结果,在右侧您可以看到当前文档(但实际上这里只有tobedeleted才有意思)。
第2步-是一个时刻,当用户想要删除这个处理过的项目时,因为他不再对它的结果感兴趣,但是这里也需要数据库文档,所以同样有一个get。
第3步-完成软删除操作,需要更新数据库文档,并且字段设置为 true .
第4步-是一个时刻,当公共流程的处理结束,并在最后有文件的更新。但是,应用程序2在第3步之前下载了它,它覆盖了应用程序1所做的事情,这是不好的。
所以我想了个解决办法。

如您所见,这些步骤是相同的,但是我没有更新同一个文档,而是更新了一个引用的文档,因此重写数据没有问题。
现在的问题是如何通过sql查询连接两个文档,因此 FK_1 id的值将被替换 ToBeDeleted 其他文档中的字段。

voase2hg

voase2hg1#

根据本文,不可能加入两个文档,这当然对我没有任何帮助,但结束了主题。
join关键字存在于语言中,但它用于“展开”嵌套容器,无法连接不同的文档。

mu0hgdu0

mu0hgdu02#

也许,可以使用子查询而不是join。
https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-subquery#mimic-与外部参照数据联接

相关问题