尝试使用泛型添加mongo索引

时间:2018-03-20 14:50:02

标签: c# mongodb aggregate

我们通常使用像这样的构建器添加索引

var keys = Builders<DocumentFolder>.IndexKeys.Ascending("Property1").Descending("Property2");
var opts = new CreateIndexOptions();
opts.Unique = false;
Collection.Indexes.CreateOne(keys, opts);

我正在尝试为我们添加的动态集合使其更通用,所以我尝试了这个

var Indexes = new Dictionary<string, string> {
    {"Property1", "A"},
    {"Property2", "D"}
};
var keys = Indexes.Aggregate(Builders<BsonDocument>.IndexKeys, 
    (current, next) => next.Value == "A" ? 
    current.Ascending(next.Key) : current.Descending(next.Key));
Collection.Indexes.CreateOne(keys, new CreateIndexOptions {Unique = isUnique});

但我得到一个“无法将类型'MongoDB.Driver.IndexKeysDefinition'隐式转换为'MongoDB.Driver.IndexKeysDefinitionBuilder'”错误。根据我对Aggregate的理解,两个代码段都应该返回等效的对象。我错了或者我的代码中有什么问题吗?

1 个答案:

答案 0 :(得分:0)

所以我试图让Aggregate工作,但却无法让它工作。我假设它与升序/降序有关,返回的索引类型不同于IndexKeys。这虽然有效。

IndexKeysDefinitionBuilder<BsonDocument> builder = Builders<BsonDocument>.IndexKeys;
List<IndexKeysDefinition<BsonDocument>> definitions = 
    Indexes.Select(index => index.Value == "A" ? 
    builder.Ascending(index.Key) : 
    builder.Descending(index.Key)).ToList();
IndexKeysDefinition<BsonDocument> keys = 
    Builders<BsonDocument>.IndexKeys.Combine(definitions);
Collection.Indexes.CreateOne(keys, new CreateIndexOptions {Unique = isUnique});

如果有人可以进行汇总工作,我会接受他们的答案,因为这是最初的问题。