2

我正在尝试进行多字段“不同”查询,这当然是不可能的
(请参阅我的尝试:从 linq 查询中选择新类型

在我意识到这一点之后,我发现我可以通过使用 .group 和 MongoDB 来检索我需要的数据。

有没有办法在 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 回答