MongoDB.Driver与Cosmos DB数组搜索
问题描述:
我有一个使用本机mongoDb的应用程序,现在我们将它指向Azure Cosmos数据库实例,但是现在我们在查询数组时没有得到结果。MongoDB.Driver与Cosmos DB数组搜索
例如,我们有以下客户:
{
"email" : "[email protected]",
"data" : {
"customerGuid" : "a30b5d75ca6241dcbd0260b2516a2165",
"addresses" : [
{
"firstName" : "firstname",
"lastName" : "lastname",
"postalCode" : "SY1 3VE",
}
]
}
}
而且我们正在使用的MongoDB.Driver(通过AsQueryable已和LINQ)找到所有客户的地址数组中的一个项目匹配
即
var col = db.GetCollection<Customer>("Customer");
var custQuery = col.AsQueryable()
.Where(c => c.Data.Addresses.Any(a => a.PostalCode == "SY1 3VE"));
但是,我没有得到任何匹配。在进一步的挖掘,它似乎产生蒙戈查询,看起来像:
{aggregate([{ "$match" : { "data.addresses.postalCode" : "SY1 3VE" } }])}
当我尝试手动对数据库或者这并不为我工作。
我做错了什么?或者是Cosmos Mongo Db实现与MongoDB.Driver不完全兼容呢?
答
我做错了什么?或者是Cosmos Mongo Db实现与MongoDB.Driver不完全兼容呢?
正如您所提到的那样,Cosmos Mongo Db可能没有像本地MongoDB那样执行完整的命令。我想你也提到的代码获得
没有记录返回
但是我们可以使用过滤器来做到这一点,我有下面的代码进行测试。它在我身边正常工作。
var collection = db.GetCollection<BsonDocument>("BsonDocument");
var test = collection.Find(Builders <BsonDocument>.Filter.ElemMatch<BsonDocument>("data.addresses",
"{\"postalCode\":\"SY1 3VE\"}")).ToList();
另一种选择:
根据我的经验,这是不推荐,因为它会查询所有的文件到客户端。
var col = db.GetCollection<Customer>("Customer");
var custQuery = collection.AsQueryable().ToList().Where(c => c.Data.Addresses.Any(a => a.PostalCode == "SY1 3VE"));
+0
一样行动。谢谢,我已将您标记为答案,因为我同意它看起来不受支持。在我的用例中,“另一种选择”会过于沉重,因为会有很多记录。 – Vdex
该查询看起来不错。你确定你在查询正确的数据库/集合吗? – Veeram
我很确定。如果我通过roboMongo 0结果运行同样的事情,请将其编辑为 aggregate([{“$ match”:{“data.addresses”:{$ elemMatch:{“postalCode”:“SY1 3VE”}}}}] ) 它然后工作! – Vdex
单个查询条件与elemMatch操作符一样可用。 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition。你可以尝试在蒙戈壳? – Veeram