1

我想在 mongodb 中运行一个查询,如下所示(在 SQL 中)。输出应存储到游标中。

SELECT ipv4 src, SUM(flags) 
FROM table 
WHERE starttime > 1262300400 AND endtime < y AND port dst = 22 
GROUP BY ipv4, src

我读了http://docs.mongodb.org/manual/reference/aggregation/group/

并尝试过

myCursor = db.mycol.find(  [  
  {$group:{ _id: "$src",total:{$sum:"$flags"}}},
  {$match:{$and:[{"dst":22},
          {$and:[{"starttime":{$gt:1262300400}},{"endtime":{$lt:1264978800}}]}]}  
  }  ]);

但它失败了。

顺便说一句:我可以通过检查它们之间的范围来在两个 unix 时间戳之间进行搜索吗?在上面的示例中,我尝试搜索介于1262300400和之间的时间1264978800

4

1 回答 1

1

您需要使用该aggregate方法而不是find执行此操作,并且您不需要在字段中使用所有这些$and运算符,$match因为这些字段自然是与运算。并将$match操作放在首位,这样您就不会$group处理比您需要的更多的文档。

db.mycol.aggregate([
    {$match:{"dst":22, "starttime":{$gt:1262300400}, "endtime":{$lt:1264978800}}},
    {$group:{ _id:"$src", total:{$sum:"$flags"}}}
]);
于 2012-12-30T17:22:30.110 回答