我有一个MongoDB集合"foos“,其中包含每个条目都有一个”bar“数组。也就是说,"foo“具有以下模式:
{
"id": UUID
"name": string
...
"bars": [
"id": UUID
"key": string
...
]
}我需要使用MongoDB C# .NET .NET驱动程序在name和.NET上创建索引。
我假设我可以使用Linq函数来完成以下工作:
Indexes.Add(Context.Collection<FooDocument>().Indexes.CreateOne(
Builders<FooDocument>.IndexKeys
.Descending(x => x.Bars.Select(y => y.Key))));但是,这会导致InvalidOperationException:
System.InvalidOperationException:“无法确定x => x.Bars.Select(y => y.Id)的序列化信息。”
关于MultiKey索引的Mongo文档展示了如何使用简单的点表示法创建这样的索引,即
db.foos.createIndex( { "name": 1, "bars.key": 1 } )然而,MongoDB驱动程序文档似乎认为,像我正在做的那样使用Linq函数是正确的。
如何使用MongoDB .NET驱动程序(最好使用Linq函数)在集合上创建多键索引?
发布于 2017-05-19 12:57:18
这是一个如何使用C#实现此操作的示例
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2));
await collection.Indexes.CreateOneAsync(indexDefinition); 更新
对于数组中的索引,最近我找到的是使用"-1“作为索引,然后构建索引键。我从github了解到,在构建查询的情况下,源代码是一个有效的选项。
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-1].Key));
await collection.Indexes.CreateOneAsync(indexDefinition); "-1“是侧mongodb C#驱动程序中的硬编码常量,意思是"$”(证明)。因此,这段代码将尝试创建索引:
{ "Key1": 1, "Key2.$.Key": 1 }它可以从数据库查询信息,但不允许(将抛出一个异常“indexes包含一个非法字段名:字段名以‘$’开头‘)用于索引中。因此,我假设应该在mongodb驱动程序中更改它以使其工作。类似于"-2“的意思是空操作符。在这种情况下我们可以用
var indexDefinition = Builders<FooDocument>.IndexKeys.Combine(
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key1),
Builders<FooDocument>.IndexKeys.Ascending(f => f.Key2[-2].Key));
await collection.Indexes.CreateOneAsync(indexDefinition); 这将生成如下索引:
{ "Key1": 1, "Key2.Key": 1 }因此,基本上,我认为现在不可能在不改变mongo C#驱动程序的情况下使用纯Linq来构建您想要的索引。
所以我认为你唯一的选择就是这样,仍然是C#,但没有Linq
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});发布于 2017-09-26 00:01:15
这似乎是一个请求C#驱动程序的特性,虽然它最近没有看到任何进展。尽管如此,有人确实在JIRA线程上提交了一个粗略的、现成的解决方案,所以也许这将为您完成任务。
发布于 2017-11-23 18:06:10
您可以在nameof() 6中创建字符串索引并使用C# 6:
Indexes.Add(Context.Collection<FooDocument>().Indexes.CreateOne($"{nameof(FooDocument.Bars)}.{nameof(Bars.Key)}"));https://stackoverflow.com/questions/44070496
复制相似问题