我有一个使用本机mongoDb的应用程序,我们现在将它指向Azure Cosmos数据库实例,但我们现在在查询数组时没有得到结果。
例如,我们有以下客户:
{
"email" : "findcustomer.feature@test.com",
"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"));
但是,我没有得到任何比赛。进一步深入研究,它似乎正在生成一个看似如下的Mongo查询:
{aggregate([{ "$match" : { "data.addresses.postalCode" : "SY1 3VE" } }])}
当我手动对数据库尝试时,这对我不起作用。
我做错了吗?或者Cosmos Mongo Db实现与MongoDB.Driver不完全兼容?
答案 0 :(得分:1)
我做错了吗?或者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"));