2017-06-13 4 views
0

Ich habe eine Anwendung, die native MongoDb verwendet, wir zeigen es jetzt auf eine Azure Cosmos DB-Instanz, aber wir bekommen jetzt keine Ergebnisse bei der Abfrage von Arrays.MongoDB.Driver mit Cosmos DB Array-Suchen

Zum Beispiel haben wir folgende Kunden:

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

Und wir mit dem MongoDB.Driver (via AsQueryable und Linq) alle Kunden auf ein Element in der Adressen-Array passende finden

dh

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

Aber ich bin immer noch keine Streichhölzer. Graben weiter, so scheint es zu sein, um eine Mongo Abfrage zu erzeugen, die wie folgt aussieht:

{aggregate([{ "$match" : { "data.addresses.postalCode" : "SY1 3VE" } }])} 

Welche nicht für mich arbeiten, wenn ich entweder manuell gegen die Datenbank versuchen.

Mache ich etwas falsch? Oder ist die Kosmos-Mongo-Db-Implementierung noch nicht vollständig kompatibel mit dem MongoDB.Driver?

+0

Die Abfrage sieht gut aus. Sind Sie sicher, dass Sie die richtige Datenbank/Sammlung abfragen? – Veeram

+0

Ich bin mir ziemlich sicher. Wenn ich dasselbe über roboMongo 0-Ergebnisse ausführe, dann bearbeite es so, dass es aggregiert ([{"$ match": {"data.addresses": {$ elemMatch: {"postalCode": "SY1 3VE"}}}}]) Es funktioniert dann! – Vdex

+0

Einzelabfrage funktioniert mit und ohne elemMatch-Operator. https://docs.mongodb.com/manual/reference/operator/query/elemMatch/#single-query-condition. Kannst du es in Mongo Shell versuchen? – Veeram

Antwort

1

Mache ich etwas falsch? Oder ist die Kosmos-Mongo-Db-Implementierung noch nicht vollständig kompatibel mit dem MongoDB.Driver?

Wie Sie erwähnt haben die Cosmos Mongo Db möglicherweise nicht ganze Befehle als native MongoDB implementiert. Ich habe versucht, den Code, den Sie auch

gibt es keine Aufzeichnungen

zurück

bekommen erwähnt Aber wir Filter verwenden, könnte das zu tun, ich mit folgenden Code getestet. Es funktioniert richtig auf meiner Seite.

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

Eine weitere Option:

auf meiner Erfahrung Basierend, es ist nicht empfohlen, da es alle Dokumente zum Client abfragt.

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

Danke, ich habe Ihre als die Antwort markiert, wie ich zustimmen, dass es aussieht, wie es nicht unterstützt wird.Die "andere Wahl" wäre in meinem Anwendungsfall zu schwer, da es viele Platten geben wird. – Vdex

Verwandte Themen