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不完全兼容呢?

+0

该查询看起来不错。你确定你在查询正确的数据库/集合吗? – Veeram

+0

我很确定。如果我通过roboMongo 0结果运行同样的事情,请将其编辑为 aggregate([{“$ match”:{“data.addresses”:{$ elemMatch:{“postalCode”:“SY1 3VE”}}}}] ) 它然后工作! – Vdex

+0

单个查询条件与elemMatch操作符一样可用。 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition。你可以尝试在蒙戈壳? – Veeram

我做错了什么?或者是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")); 
+0

一样行动。谢谢,我已将您标记为答案,因为我同意它看起来不受支持。在我的用例中,“另一种选择”会过于沉重,因为会有很多记录。 – Vdex