如何在数组.NET驱动程序中的项目属性上创建MongoDB MultiKey索引

伊万

我有一个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函数)在集合上创建多键索引?

Artyom

这是一个使用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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

乘法后如何在数组中添加每个索引

如何创建UDF以在数组列中查找索引

iOS Swift:如何在数组中存储所有重复值的索引?

如何在数组中显示数组

如何在C#Mongodb强类型驱动程序中基于嵌套数组元素创建索引

如何使用C#驱动程序从现有索引中创建Mongo索引定义?

Python:如何在数组中查找特定元素的索引?

如何在数组中打印所有递增索引的三元组?

如果条件为true,如何在数组中的特定索引中插入数据,如果为false,如何为零

如何在数组中合并索引以在Java中创建1个主数组/字符串?

如何在数组中打印10个最小值的索引

如何在数组中创建

如何在数组索引的数组中设置值

如何在数组中查找数组的索引

如何在数组属性上创建全文索引?

如何使用Java驱动程序在MongoDB中创建复合文本索引

如何在数组中搜索特定的char以及如何在c#中操作该索引

如何在数组中查找最大n个值的索引

如何在数组中获取数组?

如何在数组 A 中找到一个随机索引,该索引没有出现在数组 B 中?

如何从特定索引-Javascript 在数组中添加项目

如何在数组索引中排序以索引

如何在数组 A 中找到空白项的索引并将它们推送到数组 B 中的相同索引中?

在 mongo db 中,如何在不知道索引的情况下在数组数组中设置值?

如何在数组数组中填充

如何在数组中搜索具有特定索引的值并修改其值?

如何在数组中查找数组

如何在数组中追加 mongoDB

如何在数组中的某个索引之后将所有元素移动 1 个位置?C#