假设我有以下集合:
{ _id: 1, Array: [
{ K: "A", V: 8 },
{ K: "B", V: 5 },
{ K: "C", V: 13 } ] }
{ _id: 2, Array: [
{ K: "D", V: 12 },
{ K: "E", V: 14 },
{ K: "F", V: 2 } ] }
Run Code Online (Sandbox Code Playgroud)
我想运行一个返回具有最高"V"的子文档的查询,所以在这种情况下我会得到:
{ _id: 1, Array: [ { K: "E", V: 14 } ] }
Run Code Online (Sandbox Code Playgroud)
或者干脆:
{ K: "E", V: 14 }
Run Code Online (Sandbox Code Playgroud)
重要的是我希望Mongo服务器上的内存使用量为O(1)(无论我处理多少文档,内存使用量是不变的),我只想检索那个我需要的值的子文档(我不想下载超过必要的更多子文档).
我首选的方法是使用简单的查找查询,但我不确定这是否可行.我怀疑这也可以通过聚合框架(或map reduce?)来完成,但是看不出来.我不希望结果存储在临时集合中,而是直接返回给我的客户端(就像普通查询一样).
给出一个包含以下文档的集合:
{
"host" : "example.com",
"ips" : [
{
"ip" : NumberLong("1111111111"),
"timestamp" : NumberLong(1373970044)
},
{
"ip" : NumberLong("2222222222"),
"timestamp" : NumberLong(1234978746)
}
]
}
Run Code Online (Sandbox Code Playgroud)
我需要与X的IP值返回所有文件,但只有当X相关的时间戳是最高的IPS阵列中的时间戳(所以上面的例子中文件应该不匹配"2222222222"的搜索,因为这是没有的IP最近的时间戳).
这是我第一次在MongoDB中做了一些非常基本的东西,所以我能得到的最接近的是:
coll.aggregate({$ match:{"ips.ip":X}},{$ group:{"_ id":"$ host","max":{$ max:"$ ips.timestamp"}}} {$排序:{ "ips.timestamp": - 1}})导致
这显然没有给我我正在寻找的东西,它返回任何ips.ip值为X.如果X的关联时间戳是该ips数组的最高值,我怎么才返回ip.ip为X的文件?