如何索引 MongoDB 中的屬性對象?
我有以下範例文件:
{ "_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()方法。
partialFilterExpression
該partialFilterExpression
選項接受使用以下方式指定過濾條件的文件:例如
在集合上創建部分索引
考慮包含類似於以下文件的集合餐廳
{ "_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" } } } )
希望這對您有所幫助。