MongoDB.Driver 使用 Cosmos DB 数组搜索

MongoDB.Driver with Cosmos DB array searches

我有一个使用本机 mongoDb 的应用程序,我们现在将它指向 Azure Cosmos DB 实例,但我们现在在查询数组时没有得到结果。

例如,我们有以下客户:

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

Am I doing something wrong? Or is the Cosmos Mongo Db implementation not fully compatible with the MongoDB.Driver yet?

正如您提到的,Cosmos Mongo Db 可能没有像原生 MongoDB 那样实现整个命令。我试过你提到的代码也得到

there is no record returned

但是我们可以使用过滤器来做到这一点,我用下面的代码进行了测试。它在我这边正常工作。

 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"));