我有一个MongoDB集合“ foos”,其中包含每个都具有“ bars”数组的项目。也就是说,“ foo”具有以下架构:
{
"id": UUID
"name": string
...
"bars": [
"id": UUID
"key": string
...
]
}
我需要使用MongoDB C#.NET Mongo驱动程序在名称和bar.key上创建索引。
我想我可以使用Linq Select函数来做到这一点,如下所示:
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 Driver(最好使用Linq函数)在集合上创建多键索引?
这是一个使用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 }
这对于从数据库中查询信息很好,但是不允许(将抛出异常“索引键包含非法的字段名:字段名以'$'开头”),以便在索引中使用。因此,我认为应该在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}});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句