我正在尝试查询 Cosmos MongoDB 集合,我可以使用 Robo3T 和 3T Studio 以及 dotnet core mongo 客户端(在测试工具中)很好地连接到它。我可以在所有平台上对实体 (db.[collection_name].count({})) 进行计数,但是每个查询 (db.[collection_name].find({}) 都会失败并出现以下错误:
Error: error: {
"_t" : "OKMongoResponse",
"ok" : 0,
"code" : 1,
"errmsg" : "Unknown server error occurred when processing this request.",
"$err" : "Unknown server error occurred when processing this request."}
这是我来自 Rob3T 的示例查询,下面是示例 .NET 工具。无论我使用什么,每次都出现相同的错误。
db.wihistory.find({})
和 dotnet 核心代码:
string connectionString = @"my connections string here";
MongoClientSettings settings = MongoClientSettings.FromUrl(
new MongoUrl(connectionString)
);
settings.SslSettings =
new SslSettings() { EnabledSslProtocols = SslProtocols.Tls12 };
var mongoClient = new MongoClient(settings);
var database = mongoClient.GetDatabase("vstsagileanalytics");
var collection = database.GetCollection<dynamic>("wihistory");
var data = collection.Find(new BsonDocument()).ToList();
System.Console.WriteLine(data.ToString());
最佳答案
问题来自帐户中混合使用 API。如评论中所述,您正在使用 Azure Function's Cosmos DB Output binding ,它使用 SQL API ( .NET SDK for SQL API ) 连接到帐户并存储数据。该文档中有一个注释:
Don't use Azure Cosmos DB input or output bindings if you're using MongoDB API on a Cosmos DB account. Data corruption is possible.
通过此方法存储的文档不会强制执行 MongoDB 客户端会执行的某些 MongoDB 要求(例如存在“_id”标识符)(如果不存在,MongoDB 客户端将自动创建“_id”)。
Robo3T 和其他 Mongo 客户端(包括 Azure 门户)无法将存储的文档正确解析和读取为有效的 MongoDB 文档(由于缺少“_id”等要求),这就是错误的原因。
如果您想维护 Azure Functions 管道,您可以切换到使用 Cosmos DB SQL API 帐户,或者更改输出绑定(bind)并将其替换为 MongoDB client 的手动实现。
关于azure-cosmosdb - Cosmos Mongodb 查询失败但 azure 存储资源管理器工作正常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48388377/