0

我在我的一个项目中使用 java 中的 mongodb。用户将输入他知道将在 json 文件中的时间。我想要做的是搜索包含该时间的文档,从该文档到下一个 LoginRequest 文档,所有文档都将作为输出生成。

    For example:
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113ca"}, "LoginRequest" : { "Time" : "11-06-2012 11:59:33", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cc"}, "LoginResponse" : { "innerAttr1" : "innerValue1", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cb"}, "OtherRequest" : { "innerAttr3" : "innerValue3"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cd"}, "OtherResponse" : { "innerAttr2" : "innerValue2", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113ce"}, "LoginRequest" : { "Time" : "11-06-2012 12:34:05", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cf"}, "LoginResponse" : { "innerAttr1" : "innerValue1", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cg"}, "OtherRequest" : { "innerAttr3" : "innerValue3"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113ci"}, "LoginRequest" : { "Time" : "11-06-2012 14:59:33", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cm"}, "LoginResponse" : { "innerAttr1" : "innerValue1", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cj"}, "OtherRequest" : { "innerAttr3" : "innerValue3"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cs"}, "OtherResponse" : { "innerAttr2" : "innerValue2", "innerAttr4" : "innerValue4"} }

这里假设用户输入时间为“11-06-2012 12:34:05”。所以这个输出应该是:

Output:
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113ce"}, "LoginRequest" : { "Time" : "11-06-2012 12:34:05", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cf"}, "LoginResponse" : { "innerAttr1" : "innerValue1", "innerAttr4" : "innerValue4"} }
    { "_id" : { "$oid" : "4ceb753a70fdf877ef5113cg"}, "OtherRequest" : { "innerAttr3" : "innerValue3"} }

我能够获得{ "_id" : { "$oid" : "4ceb753a70fdf877ef5113ce"}, "LoginRequest" : { "Time" : "11-06-2012 12:34:05", "innerAttr4" : "innerValue4"} }输出,但我希望输出如上所述。

4

1 回答 1

2

您没有在 LoginResponse 或 OtherResponse 文档中存储任何将它们与之前的 LoginRequest 相关联的内容。因此,使用您当前的模式,您无法构造一个查询来返回 LoginRequest,然后是所有其他文档,直到下一个 LoginRequest。

如果不了解应用程序的用途和架构的详细信息,就很难为您提供明确的解决方案。但是,这里有一些建议:

(a) 在所有文档中而不只是在 LoginRequest 中存储时间戳。因此,给定一个 LoginRequest,您可以找到下一个 LoginRequest(执行按时间排序的查询),然后搜索所有其他具有两个 LoginRequest 时间戳之间时间戳的文档。

(b) 如果您的应用程序架构允许,请将 LoginRequest 的 id 存储在 LoginResponse 和 OtherRequest 文档中(直到下一个 LoginRequest)。

(c) 不要为 LoginRequest、LoginResponse 和 OtherRequest 存储单独的文档,而是将单个文档存储在集合中以用于特定登录的所有交互。然后将是一个简单的查询来检索所有这些信息。

于 2012-06-13T08:28:12.483 回答