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"
}
当然,这只是一个示例模式,您需要使用它来获得您想要的内容,但它应该让您走上正确的轨道。

您错过了一个示例