4

MongoDB C# ドライバーを使用すると、mongo クエリのみで setFields と Where 条件を使用して AsQueryable でデータを取得できないようです。このコードでドキュメントを取得しました

var query = _collection.FindAll().SetFields(fields.MongoFieldsBuilder).AsQueryable();
var query1 = query.Where(d=>d.Name="Ken").ToList();
var query2 = query.Where(d=>d.Age>=2).ToList();

そのため、query1 または query2 が実行されると、c# ドライバーは mongo からすべてのドキュメントを取得し、メモリ内でフィルター処理します。しかし、Where 条件がフィールドを持つ mongo クエリに変換されることを期待していました。誰かがそれを正しく行う方法を説明できますか?

4

1 に答える 1

5

.AsQueryable()fromを使用 しSystem.Linqているため、クライアント側ですべてをフィルタリングします。ただし、データベース内のデータをフィルタリングするには、.AsQueryable()fromを使用する必要があります。MongoCollectionこの拡張メソッドはを作成しますMongoQueryable<T>

私は以下がうまくいくはずだと信じています:

//or you could use your projection class instead of BsonDocument
var query = Items.AsQueryable<BsonDocument>()   
                 .Select(x=> new {id = x["_id"].AsObjectId, Name=x["Name"].AsString});
var query1 = query.Where(d=>d.Name == "Ken").ToList();

アップデート:

使用するSetFields場合は、古いクエリ構文を使用する必要があります。

_col.Find(Query<UserDocument>.EQ(x=> x.Name, "Ken")).SetFields(..). 

また、次のように、マジックストリングなしでSetFieldsを使用できます。

cursor.SetFields(Fields<UserDocument>.Include(x=> x.Name, x=> x.Age))

linqを使用すると、SetFieldsはを介して実行されSelectます。

お役に立てれば。

于 2012-12-19T08:40:44.627 に答える