2017-06-13 9 views
0

私はネイティブmongoDbを使用していたアプリケーションを持っていますが、今はAzure Cosmos DBインスタンスを指していますが、配列をクエリするときに結果が得られません。MongoDB.Driver with Cosmos DB配列検索

たとえば、私たちは以下の顧客を持っている:

{    
    "email" : "[email protected]",    
    "data" : {     
     "customerGuid" : "a30b5d75ca6241dcbd0260b2516a2165",         
     "addresses" : [ 
      {       
       "firstName" : "firstname", 
       "lastName" : "lastname",       
       "postalCode" : "SY1 3VE",       
      } 
     ] 
    } 
} 

そして、我々は、アドレスの配列内のアイテムに一致するすべての顧客を見つけるために(AsQueryableとLINQを経由して)MongoDB.Driverを使用している

つまり

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

クエリがよろしいですか。あなたは正しいデータベース/コレクションに対して照会していますか? – Veeram

+0

私はかなり確信しています。 roboMongo 0の結果を使って同じことを実行すると、 集計([{"$ data"] {{"data.addresses":{$ elemMatch:{"postalCode": "SY1 3VE"}}}}というように編集されます。 ) それは次に動作します! – Vdex

+0

単一照会条件は、elemMatch演算子の有無にかかわらず同様に機能します。 https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-conditionあなたはmongo shellで試すことができますか? – Veeram

答えて

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

ありがとうございます。ありがとうございます。「別の選択肢」は、多くのレコードがあるので、私のユースケースでは重すぎるでしょう。 – Vdex