带有Cosmos DB数组搜索的MongoDB.Driver

时间:2017-06-13 14:45:31

标签: mongodb linq azure mongodb-query azure-cosmosdb

我有一个使用本机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不完全兼容?

1 个答案:

答案 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();

enter image description here

另一种选择:

根据我的经验,不推荐,因为它会向客户查询所有文档。

var col = db.GetCollection<Customer>("Customer");
var custQuery = collection.AsQueryable().ToList().Where(c => c.Data.Addresses.Any(a => a.PostalCode == "SY1 3VE"));