簡體   English   中英

在MongoDB中索引對象數組

[英]Indexing arrays of objects in MongoDB

我有一個巨大的電子郵件轉儲,試圖在MongoDB中存儲和查詢。 有160萬封電子郵件,每封電子郵件都存儲為Node模塊的輸出,該模塊將原始電子郵件解析為漂亮的Javascript對象,如下所示:

{
    "text" : "This is the text of my email",
    "subject" : "Great opportunity",
    "from" : [ 
        {
            "address" : "chris.wilson@example.com",
            "name" : "Chris Wilson"
        }
    ],
    "to" : [ 
        {
            "address" : "person.a@example.com",
            "name" : "Person A"
        }, 
        {
            "address" : "person.b@example.com",
            "name" : "Person B"
        }, 
        {
            "address" : "person.c@example.com",
            "name" : "Person C"
        }
    ],
    "date" : ISODate("2015-01-05T21:38:55.000Z")
}

我需要能夠高效地查找“發送到person.a@gmail.com的所有電子郵件”或“克里斯·威爾遜發送的每個電子郵件”之類的內容(無論該名稱附加了哪個電子郵件地址)。

Mongo非常願意為我為“ to”和“ from”查詢建立索引,但是我不確定執行此操作時查詢是否有效:

db.emails.find({ "to.name": "Person A" })

這是一個覆蓋查詢,用於在作為鍵值對象數組的字段中查找特定屬性的特定值嗎? 對於我來說,此查詢的運行速度非常慢,但又又是一個很大的語料庫。

UPDATE

這是將“ .explain”附加到上述查詢的輸出:

{
    "cursor" : "BasicCursor",
    "isMultiKey" : false,
    "n" : 24,
    "nscannedObjects" : 1646837,
    "nscanned" : 1646837,
    "nscannedObjectsAllPlans" : 1646837,
    "nscannedAllPlans" : 1646837,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 17088,
    "nChunkSkips" : 0,
    "millis" : 84685,
    "server" : "DCA-TM-GUEST-iMac.local:27017",
    "filterSet" : false
}

很好,是的。 不過,您需要在to.name加一個索引才能使查詢高效。 它當前使用BasicCursor的事實表明沒有索引,或者沒有使用索引-這很奇怪。 作為參考,這些被稱為“ 多鍵 ”。

這是涵蓋的查詢嗎?[...]

我猜您的意思是“被MongoDB覆蓋了此功能”的“覆蓋”? “覆蓋查詢”是一個查詢詞,可以單獨使用索引來回答。 僅當您要返回的所有字段都是索引的一部分時,查詢才能被索引覆蓋(例如,給我ID,僅發送給John Doe的電子郵件ID),但這在很大程度上沒有意義。我猜這種情況。 另外,可悲的是, 進入文檔時尚不支持該功能

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM