2015-01-06 83 views
1

我有一个巨大的电子邮件转储,我试图在MongoDB中存储和查询。有1.6M的电子邮件,其中的每一个存储为输出从Node module来解析原始电子邮件到漂亮的JavaScript对象,就像这样:在MongoDB中为对象索引数组

{ 
    "text" : "This is the text of my email", 
    "subject" : "Great opportunity", 
    "from" : [ 
     { 
      "address" : "[email protected]", 
      "name" : "Chris Wilson" 
     } 
    ], 
    "to" : [ 
     { 
      "address" : "[email protected]", 
      "name" : "Person A" 
     }, 
     { 
      "address" : "[email protected]", 
      "name" : "Person B" 
     }, 
     { 
      "address" : "[email protected]", 
      "name" : "Person C" 
     } 
    ], 
    "date" : ISODate("2015-01-05T21:38:55.000Z") 
} 

我需要能够有效地查找喜欢的东西“的所有电子邮件发送到[email protected]“或”由'Chris Wilson'发送的每封电子邮件(无论哪个电子邮件地址附加到该名称)。

蒙戈是非常愿意指数为我“到”和“从”查询,但我不能肯定的是,查询工作当我这样做:

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 
} 

回答

0

这是完全正常的,是的。不过,您需要使用to.name上的索引来提高查询效率。目前使用BasicCursor的事实表明没有索引,或者索引没有被使用 - 这很奇怪。作为参考,这些被称为'multikeys'。

这是一个覆盖查询[...]

我猜你的意思是在意义上的“覆盖”“就是这个功能通过MongoDB的覆盖”? '涵盖查询'是一个用于查询的术语,可以单独使用索引来回答。只有当你想要返回的所有字段都是索引的一部分时(例如,给我的id,并且只发送给John Doe的电子邮件的ID),索引才能覆盖查询,但这样做不会有多大意义我猜这是上下文。另外,可悲的是,它还是not supported when reaching into documents

+1

“to.name”的索引正是我所需要的 - 谢谢! –