Index

如何索引 MongoDB 中的屬性對象?

  • December 21, 2018

我有以下範例文件:

{
   "_id" : ObjectId("556e177ca43da29e040041a7"),
   "user_id" : NumberLong(24),
   "request_datetime" : ISODate("2015-06-02T15:52:12.000-05:00"),
   "total_amount" : 102.62,
   "status" : NumberLong(1),
   "adfields" : {
       "27" : "413703562015060200132",
       "28" : "S003POS4",
       "29" : "HAYLEYS",
       "30" : "1"
   }
}

問題是我需要索引**“adfields”屬性,但它不適用於“多鍵”索引類型,也不能使用“單欄位索引”。我嘗試使用單個欄位索引來索引adfields屬性,但是當我查詢****adfields.27的特定值時,它不使用索引。我無法為adfields.27**創建單個欄位索引,因為這些數字是動態創建的。

你知道如何做到這一點嗎?非常感謝。

在更改您的模型後,我能夠完成這項工作。希望這仍然可以滿足您的目標案例。為了繞過欄位的動態特性,我創建了一個名為“field”的欄位和一個名為“value”的欄位。這允許我在已知欄位上創建多鍵索引。

db.myColl.insert(
{

"user_id" : NumberLong(24),
"request_datetime" : ISODate("2015-06-02T15:52:12.000-05:00"),
"total_amount" : 102.62,
"status" : NumberLong(1),
"adfields" : [
   {field:"27", value : "413703562015060200132"},
   {field:"28", value: "S003POS4"},
   {field:"29", value: "HAYLEYS"},
   {field:"30", value: "1"}
   ]

})

然後我針對 db.myColl.find({“adfield.field”:“30”}) 執行了一項查找,以獲取查詢的前一張圖片。我還使用了 db.myColl.explain().find() 來分析它。

然後我通過 db.myColl.createIndex({“adfield.field"1,“adfield.value”:1”}) 創建了索引。

我從上面執行了查找,果然我在 explain() 輸出中看到了 IXScan 和 isMultiKey 為真。

再次; 希望對您的模型的更改仍然與您嘗試完成的精神保持一致。

您可以通過http://docs.mongodb.org/manual/core/index-multikey/閱讀有關 mutlikey 的更多詳細資訊。

問題是我需要索引“adfields”屬性,但它不適用於“多鍵”索引類型,也不能使用“單欄位索引”。我嘗試使用單個欄位索引來索引 adfields 屬性,但是當我查詢 adfields.27 的特定值時。

我確定您在這裡犯了一些錯誤,因為 adfields 是對像數組,而 27 在數組的一個文件值內。

正如 MongoDB在此處為索引屬性記錄的那樣。如果要為特定的 27 個文件欄位創建索引,則應使用部分索引。因為部分索引僅索引滿足指定過濾條件的文件。

根據MongoDB BOL Here,部分索引僅索引集合中滿足指定過濾器表達式的文件。通過對集合中的文件子集進行索引,部分索引具有較低的儲存要求並降低了索引創建和維護的性能成本。

要創建部分索引,請使用帶有選項的db.collection.createIndex()方法。partialFilterExpressionpartialFilterExpression選項接受使用以下方式指定過濾條件的文件:

  1. 等式表達式(即欄位:值或使用運算符), $eq
  2. $exists: true表達,
  3. $gt, , ,表達式, $gte $lt $lte
  4. $type表達式,
  5. $and僅頂級運算符

例如

在集合上創建部分索引

考慮包含類似於以下文件的集合餐廳

{
  "_id" : ObjectId("5641f6a7522545bc535b5dc9"),
  "address" : {
     "building" : "1007",
     "coord" : [
        -73.856077,
        40.848447
     ],
     "street" : "Morris Park Ave",
     "zipcode" : "10462"
  },
  "borough" : "Bronx",
  "cuisine" : "Bakery",
  "rating" : { "date" : ISODate("2014-03-03T00:00:00Z"),
               "grade" : "A",
               "score" : 2
             },
  "name" : "Morris Park Bake Shop",
  "restaurant_id" : "30075445"
}

您可以在 borough 和 Cuisine 欄位上添加部分索引,選擇僅索引rating.grade欄位為A的文件:

db.restaurants.createIndex(
  { borough: 1, cuisine: 1 },
  { partialFilterExpression: { 'rating.grade': { $eq: "A" } } }
)

希望這對您有所幫助。

引用自:https://dba.stackexchange.com/questions/103098