【发布时间】:2019-02-11 23:29:27
【问题描述】:
我正在执行如下查询,该查询在 MongoDB 上运行良好,但在 CosmosDB 中有时会失败。我需要它与两者一起工作。
(XXX 是任何字符串值的占位符。所有字符串都有唯一的值,为了便于阅读而编辑,实际内容应该没有意义。)
{
server_index: {
$elemMatch: {
server: "XXX",
index: "XXX",
delete_time: { $exists: false },
path: {
$in: ["XXX", "XXX", "XXX" ]
}
}
}
}
文档的架构有点像这样:
{
...,
server_index: [
{
server: "XXX",
index: "XXX",
delete_time: ISODate(...), // optional
path: "XXX"
},
{...}, // same as above
...
],
...
}
此查询有时也可以按预期与 CosmosDB 一起使用,但有时我也会收到以下响应:
{
_t: "OKMongoResponse",
ok: 0,
code: 115,
errmsg: "Command is not supported",
$err: "Command is not supported"
}
特别奇怪的是,查询似乎成功了,上面的响应是由一个“有效”游标作为第一个文档返回的,然后导致我的文档解析器“崩溃”。
我正在使用 C++ 旧版驱动程序。 Cosmos DB 是否也支持这一点?
(根据我继承此项目的开发人员的说法,它是,并且一如既往,当您继承项目时,根据以前的开发人员,它一切正常......所以这可能是由于 Cosmos DB 的变化,由于我的测试数据的性质,或者谁知道......)
旁注:在 MongoDB 中,server_index 上有一个多键索引,如下所示:
{
"server_index.delete_time" : 1,
"server_index.server" : 1,
"server_index.index" : 1,
"server_index.path" : 1
}
这在 CosmosDB 中是否支持?
编辑:尝试使用 Robo 3T 添加此索引会静默失败,没有任何错误消息。根本没有添加索引。不错!
(请不要问奇怪的数据库模式。这就像是有原因的,相信我,我也想把它全部烧掉并用其他东西代替......我是不过,欢迎对替代查询提出建议)
【问题讨论】:
-
这些可能是 CosmosDB 支持提出的更好的问题。 MongoDB 驱动程序未使用 Cosmos 进行测试:期望它们的 API 将正确模拟 MongoDB 服务器行为。请注意,Cosmos 有不同的索引方法,Cosmos 文档目前建议创建 multiple individual indexes instead of a single compound index。您能否编辑您的问题以包含间歇性返回此错误的查询示例?
-
@Stennie 查询在我的问题中。只有字符串值与“XXX”不同,而且它们都互不相同。所有字符串都是大写的,但这没关系,因为问题不是匹配而是错误。我的问题主要归结为 1) 我的查询的哪一部分不受支持和 2) 为什么我在查询结果中收到错误(从游标返回),而不是查询本身失败,正如人们所期望的那样?
-
由于问题是间歇性的并且是 CosmosDB 特有的,我仍然认为最好向他们的支持团队提出这个问题。返回响应而不是光标听起来像一个错误,并且可以改进“不支持命令”错误以提示哪些命令失败。如果不支持命令,我预计会出现可预见的失败。
-
@Stennie 我同意,我也认为它看起来像一个服务器端错误。只是需要对此发表第二意见。我会看看是否有任何服务器端诊断可以阐明这一点,并可能提出支持请求。