5

このMongodbクエリをC#ドライバーでビルドするためにスタックしました:

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

次の何か:

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

添加:

上記のクエリは、私の別の質問から引用したものです 。MongoDB:複数の配列要素に一致する そのソリューションに参加することを歓迎します。

4

2 に答える 2

5

その正確なクエリを取得する場合は、次のようにします。

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

卑劣な部分は、さまざまなメソッドへのパラメーターの多くがクエリではなく sQueryを想定している一方で、次のようなことを行うことでインスタンスからインスタンスを作成できることです。BsonValueBsonValueQuery

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

送信された実際のクエリは、元のリクエストと正確に一致します。

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

(私はその$allような使用方法も見たことがありませんが、どうやら、まだ文書化されていないようです。)

于 2013-03-14T18:53:05.617 に答える
3

あなたが投稿したクエリが私のマシンで機能することを確認できますが、のドキュメントは$all、式またはクエリを受け入れるべきではなく、値のみを受け入れる必要があることを示しているようです:

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

(ドキュメントでは<expression>、クエリが許可されているかどうかを使用しています。と比較してください$and)。したがって、C# ドライバーは のBsonValue代わりに の配列のみを受け入れますIMongoQuery

ただし、次のクエリは同等である必要があります。

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

これは、C# ドライバーに変換されます。

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"))));
于 2013-03-14T18:22:24.840 に答える