2

複数フィールドの「個別の」クエリを実行しようとしていますが、これはもちろん不可能です
(ここで私の試みを参照してください: linq クエリから新しい型を選択する)

これに気付いた後、MongoDB で .group を使用することにより、必要なデータを取得できることがわかりました。

MongoDB C# ラッパー内で次のクエリ/コマンドを使用する方法はありますか?

disciplines = db.result.group({ 
    key: {DisciplineName:1, DisciplineCode:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("DisciplineName")) { 
        prev.DisciplineName = obj.DisciplineName; 
        prev.DisciplineCode = obj.DisciplineCode; 
    }}, 
    initial: { } 
});

Resultのクラス(ドキュメント)は次のようになります。

public class Result
{
    public virtual int ResultId { get; set; }
    public virtual string DisciplineCode { get; set; }
    public virtual string DisciplineName { get; set; }
    public virtual int CompetitorId { get; set; }
    //other stuff
}
4

1 に答える 1

3

以下を使用して解決:

var initial = new BsonDocument();

//return a list of keys for the group
var keyFunction = (BsonJavaScript)@"function(doc) { 
                                        return { 
                                            DisciplineName : doc.DisciplineName, 
                                            DisciplineCode: doc.DisciplineCode 
                                        }; 
                                    }";

var reduce = @"function(obj, prev) {
                    if (!obj.hasOwnProperty(""DisciplineName"")) {
                        prev.DisciplineName = obj.DisciplineName; 
                        prev.DisciplineCode = obj.DisciplineCode;
                    }
                }";

var bsonDocs = _db.GetCollection("result").Group(Query.Exists("DisciplineName"), keyFunction, initial, reduce, null).ToArray();

//I hate this!!
var disciplines = new List<Discipline>();

foreach (var item in bsonDocs)
    disciplines.Add(BsonSerializer.Deserialize<Discipline>(item));

私は、それぞれをオブジェクトIEnumerable<BsonDocument>にシリアル化するために繰り返し処理する必要がある方法が本当に好きではありません。Discipline

BsonDocuments のコレクションを逆シリアル化できる場合は更新されます

于 2012-07-09T12:19:53.993 に答える