假设DB包含数万个具有以下结构的文档
{
_id: ObjectId("5ef053e819aaa00013a2bd69"),
approvers: [
{
type: "ONE",
details: {
name: "NameOne",
surname: "SurnameOne"
}
},
{
type: "TWO",
details: {
name: "NameTwo",
surname: "SurnameTwo"
}
},
{
type: "THREE",
// details field is missing
}
]
}
我只需要选择这样的文档,其中没有类型的审批人“2”或“1”,或者审批者缺少details
我有一个想法把$not
和$elemMatch
结合起来
{
$or: [
{
"approvers.type": {
$not: {
$in: ["ONE", "TWO"]
}
}
},
{
approvers: {
$not: {
$elemMatch: {
type: { $in: ["ONE", "TWO"]},
details: {$exists: true}
}
}
}
}
]
}
该查询工作正常,但由于没有使用索引,所以它非常无效。根据我的理解,DB引擎必须进行完整的收集扫描,并且在每个文档中检查所有的数组元素。
实际上,集合有75k个记录,每个approvers
数组最多可以容纳3个元素。
是否有任何“诡计”使它更有效,或者唯一的选择是改变数据结构?
发布于 2022-06-11 03:02:32
这是分开收集有益的地方。
假设以上是项目,则可以采用不同的结构。
//approvals
[{
_id: ObjectId
projectId: ObjectId // etc the _id in your code
type: "one",
details: "some stuff"
},
{
_id: ObjectId
projectId: ObjectId // etc the _id in your code
type: "two",
details: "some stuff"
},
{
_id: ObjectId
projectId: ObjectId // etc the _id in your code
type: "three",
details: "some stuff"
}]
然后,在使用projectId检索相关项目之前,您可以获得$ne“一”、“二”类型的所有$in。这也应该可以通过聚合来实现,尽管我从未尝试过。
https://stackoverflow.com/questions/72579597
复制相似问题