我有一个查询查询,我需要检查文档中数组中是否有任何元素。我想索引数组的大小以优化查询,但我不知道如何创建这样的索引。
我已经通过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
}
如何为引用的长度创建索引?
答案 0 :(得分:3)
Mongo索引还没有提供这样的功能。
要存储数组的大小 - 作为解决方案,您可以使用字段arraySize并在该数组上的每次更改时手动更新它,然后在arraySize上创建字段索引。