如何在MongoDB中创建数组长度索引
本文关键字:数组 索引 创建 MongoDB | 更新日期: 2023-09-27 17:56:46
>我有一个查找查询,我需要检查文档上的数组中是否有任何元素。我想索引数组的大小以优化查询,但我不确定如何创建这样的索引。
我已经通过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)
})
文档类型如下所示:
{
"_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
}
查询如下所示:
{
"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)
}
如您所见,它会扫描相当多的文档(1125)以找到正确的文档。我想进一步减少这个数字,但我不确定如何索引这部分:
"Details.References.0" : {
"$exists" : true
}
如何为引用长度创建索引?
Mongo 索引尚未提供这样的函数。
要存储数组的大小 - 作为一种解决方案,您可以使用字段 arraySize 并在该数组的每个更改时手动更新它,然后在 arraySize 上创建字段索引。