2013-03-14 13 views
5

I ułożone na budowę tej kwerendy MongoDB w C# sterownik:MongoDB: Zbuduj zapytanie w C# kierowcy

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

Coś dalej:

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

Ponadto:

Powyższe zapytanie zaczerpnięte z innego pytania: MongoDB: Match multiple array elements Zapraszamy do wzięcia t w swoim rozwiązaniu.

Odpowiedz

5

Oto jak jeśli chcesz dostać dokładnie to zapytanie:

// 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) 
    }); 

Podstępne jest to, że podczas gdy wiele parametrów różnych Query spełnione hods oczekiwać BsonValue s zamiast kwerendy, można utworzyć BsonValue wystąpienie z instancji Query robiąc coś takiego:

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

Rzeczywista zapytanie wysłane pasuje do oryginalnego żądania dokładnie:

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

(I” d nigdy nie widziałem tego stylu użycia, ale najwyraźniej brzmi jak it's just not documented.)

3

Chociaż mogę potwierdzić, że zapytanie zostanie zaksięgowana działa na moim urządzeniu, documentation of $all wskazuje na to, że nie należy przyjmować wyrażenia lub odpytuje, ale tylko wartości:

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

(zastosowań dokumentacja <expression>, jeśli zapytania są dozwolone, compare to $and). W związku z tym sterownik C# akceptuje tylko tablicę BsonValue zamiast IMongoQuery.

Jednak następujące zapytanie powinno być równoważne:

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

co przekłada się na kierowcę C# jak

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

Zapytanie z $ i nie jest w 100% równoważne oryginalnemu. Proszę zobaczyć link na dole mojego pytania dla szczegółów. W każdym razie dziękuję za odpowiedź. – Kamarey

Powiązane problemy