Email mongodb查询持续运行
我有一个邮件存档设置,它运行以下查询,不返回任何结果。它只是持续运行。下面的查询有什么问题吗Email mongodb查询持续运行,email,mongodb,centos,Email,Mongodb,Centos,我有一个邮件存档设置,它运行以下查询,不返回任何结果。它只是持续运行。下面的查询有什么问题吗 query:{ $or: [ { $or: [ { rcpt_to: /vpadmin@vp.local/i }, { to: /vpadmin@vp.local/i }, { cc: /vpadmin@vp.local/i } ] } ] } 结果是这样的吗 [ { "$or" : [ { "rcpt_to" : /vp
query:{ $or: [ { $or: [ { rcpt_to: /vpadmin@vp.local/i }, { to: /vpadmin@vp.local/i }, { cc: /vpadmin@vp.local/i } ] } ] }
结果是这样的吗
[
{
"$or" : [
{
"rcpt_to" : /vpadmin@vp.local/i
},
{
"to" : /vpadmin@vp.local/i
},
{
"cc" : /vpadmin@vp.local/i
}
]
}
]
邮件存档应用程序在日志中显示以下内容,这些内容可以正常工作并返回结果。此搜索使用日期完成
Tue Aug 28 13:00:40 [conn3] query enkive.userWorkspaces ntoreturn:1 idhack reslen:152 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.workspaces ntoreturn:1 idhack reslen:567 0ms
Tue Aug 28 13:00:40 [conn3] insert enkive.searchQueries 0ms
Tue Aug 28 13:00:40 [conn3] insert enkive.searchResults 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.workspaces ntoreturn:1 idhack reslen:567 0ms
Tue Aug 28 13:00:40 [conn3] running multiple plans
Tue Aug 28 13:00:40 [conn3] update enkive.workspaces query: { _id: ObjectId('502b861ee4b04443c5db0481'), CreationDate: new Date(1345029662391), ModifiedUpdate: new Date(1346155131079), Creator: "enkive", WorkspaceName: "Default Workspace", SearchResults: [ "50334ba3e4b06e22baa0f244", "50334bbce4b06e22baa0f247", "50334be0e4b06e22baa0f24a", "5034f31fe4b06e22baa0f2e1", "503c9b73e4b002566417e868", "503cb27be4b002566417e86b", "5034f298e4b06e22baa0f2cc", "50334c72e4b06e22baa0f259", "5034f334e4b06e22baa0f2e4", "503c9b37e4b002566417e862", "503c9b62e4b002566417e865", "5035f329e4b0f6af52a5bb6c" ] } 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.searchResults ntoreturn:1 idhack reslen:202 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.searchResults ntoreturn:1 idhack reslen:202 0ms
Tue Aug 28 13:00:40 [conn3] running multiple plans
Tue Aug 28 13:00:40 [conn3] update enkive.searchResults query: { _id: ObjectId('503cb2e8e4b002566417e870'), ExecutionTimestamp: new Date(1346155240232), ExecutedBy: "enkive", SearchResults: {}, Status: "QUEUED", SearchQueryId: "503cb2e8e4b002566417e86f", IsSaved: false } 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.emailMessages reslen:6496 nreturned:2 0ms
Tue Aug 28 13:00:40 [conn3] insert enkive.auditLog 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.searchResults ntoreturn:1 idhack reslen:203 0ms
Tue Aug 28 13:00:40 [conn3] running multiple plans
Tue Aug 28 13:00:40 [conn3] update enkive.searchResults query: { _id: ObjectId('503cb2e8e4b002566417e870'), ExecutionTimestamp: new Date(1346155240237), ExecutedBy: "enkive", SearchResults: {}, Status: "RUNNING", SearchQueryId: "503cb2e8e4b002566417e86f", IsSaved: false } 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.emailMessages ntoreturn:1 idhack reslen:2226 0ms
Tue Aug 28 13:00:40 [conn3] insert enkive.auditLog 0ms
Tue Aug 28 13:00:40 [conn3] query enkive.emailMessages ntoreturn:1 idhack reslen:4306 0ms
Tue Aug 28 13:00:40 [conn3] insert enkive.auditLog 0ms
@sammaya当我运行你给我的
> db.emailMessages.find( { $or : [ {"rcpt_to" : vpadmin@vp.local}, {"cc" : vpadmin@vp.local}, {"to" : vpadmin@vp.local} ]} );
Tue Aug 28 17:26:10 SyntaxError: missing } after property list (shell):1
您缺少右大括号
query:{ $or: [ { $or: [ { rcpt_to: /vpadmin@vp.local/i }, { to: /vpadmin@vp.local/i }, { cc: /vpadmin@vp.local/i } ] } ]}
您缺少右大括号
query:{ $or: [ { $or: [ { rcpt_to: /vpadmin@vp.local/i }, { to: /vpadmin@vp.local/i }, { cc: /vpadmin@vp.local/i } ] } ]}
请尝试以下查询 find({$or:[{“rcpt_to”:/vpadmin@vp.local/i} ,{“cc”: /vpadmin@vp.local/i} ,{“至”:/vpadmin@vp.local/i} ]})
请尝试以下查询 find({$or:[{“rcpt_to”:/vpadmin@vp.local/i} ,{“cc”: /vpadmin@vp.local/i} ,{“至”:/vpadmin@vp.local/i} ]})
让我们谈谈为什么这个查询很慢 你的数据集有多大 这些字段都有索引吗 由于查询中有or语句和正则表达式,因此运行可能需要一些时间,尤其是在数据集相当大的情况下 在你说“再也不会回来”之前,你要等多久 你不能照样重写这个查询吗
db.emailMessages.find( { $or : [ {"rcpt_to" : /vpadmin@vp.local/i},
{"cc" : /vpadmin@vp.local/i},
{"to" : /vpadmin@vp.local/i}
]
}
)
也可以尝试向这些字段添加一些索引:
db.emailMessages.ensureIndex( { rcpt_to: 1, cc: 1, to: 1 }, { background: true } )
此外,您可能希望编写mongo map/reduce作业来执行此查询,而不是使用查询语言或添加任何索引。无论如何,您都需要执行完整的表扫描来查询此数据,而map reduce是处理此问题的更好方法
以下是mongodb map/reduce的链接:
编辑:
我根据另一个答案更改了索引创建,因为他是正确的,mongo将只为查询使用一个索引 让我们谈谈为什么这个查询很慢 你的数据集有多大 这些字段都有索引吗 由于查询中有or语句和正则表达式,因此运行可能需要一些时间,尤其是在数据集相当大的情况下 在你说“再也不会回来”之前,你要等多久 你不能照样重写这个查询吗
db.emailMessages.find( { $or : [ {"rcpt_to" : /vpadmin@vp.local/i},
{"cc" : /vpadmin@vp.local/i},
{"to" : /vpadmin@vp.local/i}
]
}
)
也可以尝试向这些字段添加一些索引:
db.emailMessages.ensureIndex( { rcpt_to: 1, cc: 1, to: 1 }, { background: true } )
此外,您可能希望编写mongo map/reduce作业来执行此查询,而不是使用查询语言或添加任何索引。无论如何,您都需要执行完整的表扫描来查询此数据,而map reduce是处理此问题的更好方法
以下是mongodb map/reduce的链接:
编辑:
我根据另一个答案更改了索引创建,因为他是正确的,mongo将只为查询使用一个索引 这种情况通常发生的原因是查询中的速度问题 您正在对索引不友好的正则表达式使用嵌套的$or 现在,没有一个预挂起的正则表达式不使用索引(),并将强制进行完整的表扫描。嵌套的$or子句也不使用索引:因此您的查询正在扫描可能非常大的表 由于这是一个邮件存档设置,我想说它可能会扫描数以百万计的文件。这就是为什么没有得到响应,查询永远“运行”下去的原因 您可以尝试稍微更改模式以提高性能。首先,您可以省略嵌套的$or,并且您可能可以在要搜索的邮件的标题字段中拆分电子邮件地址,这样您就可以有一个类似以下内容的查询:
db.emailMessages.find( {
$or : [ {"rcpt_to" : vpadmin@vp.local},
{"cc" : vpadmin@vp.local},
{"to" : vpadmin@vp.local} ]
} )
您在这里查询的字段可以是电子邮件地址数组,这样就可以了。在此之后,您需要设置正确的索引,如@Macdiesel所示:
db.emailMessages.ensureIndex( { rcpt_to: 1, cc: 1, to: 1 }, { background: true } );
我在这里创建了一个复合索引,因为MongoDB每个查询只能使用一个索引
这不仅会返回一个响应,而且不会杀死您的服务器,而且应该是超级性能和可扩展的(大多数情况下,可能需要更多的改进)
编辑
好的,我需要澄清一下
您需要引用搜索字符串,如下所示:
db.emailMessages.find( {
$or : [ {"rcpt_to" : "vpadmin@vp.local"},
{"cc" : "vpadmin@vp.local"},
{"to" : "vpadmin@vp.local"} ]
} )
由于除一个字段外,所有字段都可以是多个电子邮件地址,我建议您将cc
和to
拆分为一组电子邮件地址,如:
{
_id: {},
rcpt_to: "vpadmin@vp.local",
cc: ["me@awesome.com", "you@kool.com"],
to: ["another@notsokool.com"],
message: "yo"
}
当然,这只是一个示例模式,您需要使用它来获得您想要的内容,但它应该让您走上正确的轨道。这种情况通常发生的原因是查询中的速度问题 您正在对索引不友好的正则表达式使用嵌套的$or 现在,没有一个预挂起的正则表达式不使用索引(),并将强制进行完整的表扫描。嵌套的$or子句也不使用索引:因此您的查询正在扫描可能非常大的表 由于这是一个邮件存档设置,我想说它可能会扫描数以百万计的文件。这就是为什么没有得到响应,查询永远“运行”下去的原因 您可以尝试稍微更改模式以提高性能。首先,您可以省略嵌套的$or,并且您可能可以在要搜索的邮件的标题字段中拆分电子邮件地址,这样您就可以有一个类似以下内容的查询:
db.emailMessages.find( {
$or : [ {"rcpt_to" : vpadmin@vp.local},
{"cc" : vpadmin@vp.local},
{"to" : vpadmin@vp.local} ]
} )
您在这里查询的字段可以是电子邮件地址数组,这样就可以了。在此之后,您需要设置正确的索引,如@Macdiesel所示:
db.emailMessages.ensureIndex( { rcpt_to: 1, cc: 1, to: 1 }, { background: true } );
我在这里创建了一个复合索引,因为MongoDB每个查询只能使用一个索引
这不仅会返回一个响应,而且不会杀死您的服务器,而且应该是超级性能和可扩展的(大多数情况下,可能需要更多的改进)
编辑
好的,我需要澄清一下
您需要引用搜索字符串,如下所示:
db.emailMessages.find( {
$or : [ {"rcpt_to" : "vpadmin@vp.local"},
{"cc" : "vpadmin@vp.local"},
{"to" : "vpadmin@vp.local"} ]
} )
由于除一个字段外,所有字段都可以是多个电子邮件地址,我建议您将cc
和to
拆分为一组电子邮件地址,如:
{
_id: {},
rcpt_to: "vpadmin@vp.local",
cc: ["me@awesome.com", "you@kool.com"],
to: ["another@notsokool.com"],
message: "yo"
}
当然,这只是一个示例模式,您需要使用它来获得您想要的内容,但它应该让您走上正确的轨道。您错过了一个示例