首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在数组MongoDB驱动程序中对项的属性创建MultiKey索引

如何在数组MongoDB驱动程序中对项的属性创建MultiKey索引
EN

Stack Overflow用户
提问于 2017-05-19 12:44:54
回答 5查看 11.6K关注 0票数 19

我有一个MongoDB集合"foos“,其中包含每个条目都有一个”bar“数组。也就是说,"foo“具有以下模式:

代码语言:javascript
复制
{
    "id": UUID
    "name": string
    ...
    "bars": [
        "id": UUID
        "key": string
        ...
    ]
}

我需要使用MongoDB C# .NET .NET驱动程序在name和.NET上创建索引。

我假设我可以使用Linq函数来完成以下工作:

代码语言:javascript
复制
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文档展示了如何使用简单的点表示法创建这样的索引,即

代码语言:javascript
复制
db.foos.createIndex( { "name": 1, "bars.key": 1 } )

然而,MongoDB驱动程序文档似乎认为,像我正在做的那样使用Linq函数是正确的。

如何使用MongoDB .NET驱动程序(最好使用Linq函数)在集合上创建多键索引?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-05-19 12:57:18

这是一个如何使用C#实现此操作的示例

代码语言:javascript
复制
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了解到,在构建查询的情况下,源代码是一个有效的选项。

代码语言:javascript
复制
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#驱动程序中的硬编码常量,意思是"$”(证明)。因此,这段代码将尝试创建索引:

代码语言:javascript
复制
{ "Key1": 1, "Key2.$.Key": 1 }

它可以从数据库查询信息,但不允许(将抛出一个异常“indexes包含一个非法字段名:字段名以‘$’开头‘)用于索引中。因此,我假设应该在mongodb驱动程序中更改它以使其工作。类似于"-2“的意思是空操作符。在这种情况下我们可以用

代码语言:javascript
复制
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); 

这将生成如下索引:

代码语言:javascript
复制
{ "Key1": 1, "Key2.Key": 1 }

因此,基本上,我认为现在不可能在不改变mongo C#驱动程序的情况下使用纯Linq来构建您想要的索引。

所以我认为你唯一的选择就是这样,仍然是C#,但没有Linq

代码语言:javascript
复制
await collection.Indexes.CreateOneAsync(new BsonDocument {{"name", 1}, {"bars.key", 1}});
票数 18
EN

Stack Overflow用户

发布于 2017-09-26 00:01:15

这似乎是一个请求C#驱动程序的特性,虽然它最近没有看到任何进展。尽管如此,有人确实在JIRA线程上提交了一个粗略的、现成的解决方案,所以也许这将为您完成任务。

票数 9
EN

Stack Overflow用户

发布于 2017-11-23 18:06:10

您可以在nameof() 6中创建字符串索引并使用C# 6:

代码语言:javascript
复制
Indexes.Add(Context.Collection<FooDocument>().Indexes.CreateOne($"{nameof(FooDocument.Bars)}.{nameof(Bars.Key)}"));
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44070496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档