我有一个如下的文档结构(省略所有带有下划线前缀的文档,如\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
其他文档中的字段。
2条答案
按热度按时间voase2hg1#
根据本文,不可能加入两个文档,这当然对我没有任何帮助,但结束了主题。
join关键字存在于语言中,但它用于“展开”嵌套容器,无法连接不同的文档。
mu0hgdu02#
也许,可以使用子查询而不是join。
https://docs.microsoft.com/en-us/azure/cosmos-db/sql-query-subquery#mimic-与外部参照数据联接