如何在 MongoDB 中为数组长度创建索引?

Tho*_*sen 7 c# mongodb mongodb-query

我有一个查找查询,我需要检查文档的数组中是否有任何元素。我想索引数组的大小以优化查询,但我不确定如何创建这样的索引。

我已经通过 MongoDB C# 驱动程序创建了过滤器:

Builders<Post>.Filter.And(new List<FilterDefinition<Post>>()
{
    Builders<Post>.Filter.Eq(x => x.Category, Category.COLLECTION),
    Builders<Post>.Filter.SizeGt(x => x.Details.References, 0)
})  
Run Code Online (Sandbox Code Playgroud)

文档类型如下所示:

{ 
    "_id" : ObjectId("577a271f2b365917c4d72678"), 
    "UserId" : ObjectId("577a26a32b365917c4d67e42"), 
    "Category" : NumberInt(4), 
    "Details" : {
        "_id" : ObjectId("577a271f2b365917c4d72677"), 
        "References" : [
            {
                "RefId" : ObjectId("577a887b4fd1ae0e1c7b2035"), 
                "Order" : NumberInt(0), 
                "RefType" : NumberInt(1)
            }
        ]
    }, 
    "Modified" : ISODate("2016-07-05T01:26:33.549+0000"),  
    "IsActive" : true
}
Run Code Online (Sandbox Code Playgroud)

查询如下所示:

{ 
????"query" : {
????????"find" : "post", 
????????"filter" : {
????????????"UserId" : {
????????????????"$in" : [
????????????????????ObjectId("577a26a12b365917c4d67dd5"),
                    ObjectId("577a26a12b365917c4d67dd3")
????????????????]
????????????}, 
????????????"IsActive" : true, 
????????????"$or" : [
????????????????{
????????????????????"Category" : NumberInt(4), 
????????????????????"UserId" : {
????????????????????????"$nin" : [

????????????????????????]
????????????????????}, 
????????????????????"Details.References.0" : {
????????????????????????"$exists" : true
????????????????????}
????????????????}, 
????????????????{
????????????????????"Category" : {
????????????????????????"$ne" : NumberInt(4)
????????????????????}
????????????????}
????????????], 
????????????"Modified" : {
????????????????"$lt" : ISODate("2016-07-04T13:59:32.094+0000")
????????????}
????????}, 
????????"sort" : {
????????????"Modified" : NumberInt(-1)
????????}, 
????????"limit" : NumberInt(10)
????}, 
????"time" : NumberInt(33), 
????"docsScanned" : NumberInt(1125)
}
Run Code Online (Sandbox Code Playgroud)

如您所见,它会扫描相当多的文档 (1125) 以找到正确的文档。我想进一步减少这个数字,但我不确定如何索引这部分:

"Details.References.0" : {
    "$exists" : true
}
Run Code Online (Sandbox Code Playgroud)

如何为参考文献的长度创建索引?

pro*_*r79 5

Mongo 索引还没有提供这样的功能。

要存储数组的大小 - 作为一种解决方案,您可以拥有字段 arraySize 并在该数组的每次更改时手动更新它,然后在 arraySize 上创建字段索引。