假設資料庫包含數以萬計的具有以下結構的檔案
{
_id: ObjectId("5ef053e819aaa00013a2bd69"),
approvers: [
{
type: "ONE",
details: {
name: "NameOne",
surname: "SurnameOne"
}
},
{
type: "TWO",
details: {
name: "NameTwo",
surname: "SurnameTwo"
}
},
{
type: "THREE",
// details field is missing
}
]
}
我只需要選擇沒有“TWO”或“ONE”型別的批準人或批準人缺少詳細資訊的此類檔案
我有一個想法$not結合使用$elemMatch:
{
$or: [
{
"approvers.type": {
$not: {
$in: ["ONE", "TWO"]
}
}
},
{
approvers: {
$not: {
$elemMatch: {
type: { $in: ["ONE", "TWO"]},
details: {$exists: true}
}
}
}
}
]
}
該查詢有效,但由于未使用索引,因此非常無效。根據我的理解,資料庫引擎必須進行完整的集合掃描,并在每個檔案中檢查所有陣列元素。
實際上該集合有 75k 條記錄,每個approvers陣列最多可以容納 3 個元素。
是否有任何“技巧”可以使其更有效,或者唯一的選擇是更改資料結構?
uj5u.com熱心網友回復:
這是分離收集有益的地方
假設以上是專案,可以采用不同的結構
//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"
}]
然后,您可以在使用 $in 檢索相關專案之前獲取鍵入 $ne ["one", "two"] 的所有 projectId。盡管我從未嘗試過,但這也應該可以通過聚合來實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/489693.html
標籤:mongodb
下一篇:MissingSchemaError:尚未為模型“用戶,userSchema”注冊架構。使用mongoose.model(name,schema)
