2013-03-14 12 views
5

ich diese MongoDB Abfrage in C# Treiber zu bauen gestapelt:MongoDB: Build-Abfrage in C# Treiber

var geoQuery = Query.WithinCircle("Location", x, y, radius); 
var propertiesQuery = **?**; 
var query = Query.And(geoQuery, propertiesQuery); 

Zusatz:

Die obige Abfrage

nächsten
{ 
    Location: { "$within": { "$center": [ [1, 1], 5 ] } }, 
    Properties: { 
     $all: [ 
      { $elemMatch: { Type: 1, Value: "a" } }, 
      { $elemMatch: { Type: 2, Value: "b" } } 
     ] 
    } 
} 

Etwas genommen von meiner anderen Frage: MongoDB: Match multiple array elements Sie sind willkommen, par t in seiner Lösung.

Antwort

5

Hier ist, wie wenn man die genaue Abfrage erhalten mag:

// create the $elemMatch with Type and Value 
// as we're just trying to make an expression here, 
// we'll use $elemMatch as the property name 
var qType1 = Query.EQ("$elemMatch", 
    BsonValue.Create(Query.And(Query.EQ("Type", 1), 
        Query.EQ("Value", "a")))); 
// again 
var qType2 = Query.EQ("$elemMatch", 
    BsonValue.Create(Query.And(Query.EQ("Type", 2), 
        Query.EQ("Value", "b")))); 
// then, put it all together, with $all connection the two queries 
// for the Properties field 
var query = Query.All("Properties", 
    new List<BsonValue> { 
     BsonValue.Create(qType1), 
     BsonValue.Create(qType2) 
    }); 

Der hinterhältige Teil ist, dass viele der Parameter zu den verschiedenen Query erfüllt Hods erwartet BsonValue s anstatt Abfragen, Sie so etwas wie, indem Sie eine BsonValue Instanz von einer Query Instanz erstellen:

// very cool/handy that this works 
var bv = BsonValue.Create(Query.EQ("Type", 1)); 

Die eigentliche Abfrage entspricht Ihre ursprüngliche Anfrage gesendet genau:

query = { 
    "Properties": { 
    "$all": [ 
     { "$elemMatch": { "Type": 1, "Value": "a" }}, 
     { "$elemMatch": { "Type": 2, "Value": "b" }} 
    ] 
    } 
} 

(I‘ d nie gesehen, dass Stil von $all Verwendung entweder, aber anscheinend klingt es wie it's just not documented noch.)

3

Während ich kann bestätigen, dass die Abfrage Sie funktioniert auf meinem Rechner geschrieben, scheint die documentation of $all um anzuzeigen, dass es sollten Ausdrücke nicht akzeptieren oder fragt, sondern nur Werte:

Syntax: { field: { $all: [ <value> , <value1> ... ] } 

(Die Dokumentation verwendet <expression>, wenn Abfragen zulässig sind, compare to $and). Dementsprechend akzeptiert der C# -Treiber nur ein Array von BsonValue anstelle von IMongoQuery.

Allerdings soll die folgende Abfrage gleichwertig:

{ 
    $and: [ 
     { "Location": { "$within": { "$center": [ [1, 1], 5 ] } } }, 
     { "Properties" : { $elemMatch: { "Type": 1, "Value": "a" } } }, 
     { "Properties" : { $elemMatch: { "Type": 2, "Value": "b" } } } 
    ] 
} 

, die an dem als

C# Treiber übersetzt
var query = 
Query.And(Query.WithinCircle("Location", centerX, centerY, radius), 
Query.ElemMatch("Properties", Query.And(Query.EQ("Type", 1), Query.EQ("Value", "a"))), 
Query.ElemMatch("Properties", Query.And(Query.EQ("Type", 2), Query.EQ("Value", "b")))); 
+0

Die Abfrage mit $ und ist nicht 100% gleichwertig zu den ursprünglichen. Bitte beachten Sie den Link am Ende meiner Frage für Details. Wie auch immer, danke für deine Antwort. – Kamarey

Verwandte Themen