javascript - 获取具有不同标准的最新文档

标签 javascript mongodb mongodb-query

情况

我在想出一个执行特定 MongoDb 查询的好方法时遇到了麻烦。首先,这是我想要执行的查询类型。假设一个简单的数据库通过电子刷卡记录进入和退出事件(以及可能的其他操作,无关紧要)。所以有一个名为 swipelog 的集合,其中包含如下所示的简单文档:

{
    _id: ObjectId("524ab4790a4c0e402200052c")
    name: "John Doe", 
    action: "entry",
    timestamp: ISODate("2013-10-01T1:32:12.112Z") 
}

现在我想列出姓名和他们的最后进入时间(以及我可能想要的任何其他字段,但下面的示例仅使用这两个字段)。

当前解决方案

这是我现在拥有的,作为 MongoDb JavaScript 控制台的“单行代码”:

db.swipelog.distinct('name')
           .forEach( function(name) {

    db.swipelog.find( { name: name, action:"entry" } )
               .sort( { $natural:-1 } )
               .limit(1)
               .forEach( function(entry) {

        printjson( [ entry.name, entry.timestamp ] )
    }) 
})

它打印出类似的东西:

[ "John Doe", ISODate("2013-10-01T1:32:12.112Z")]
[ "Jane Deo", ISODate("2013-10-01T1:36:12.112Z")]
...

问题

我认为上面有明显的缩放问题。如果有一百个名字,那么将对数据库进行 1+100 次查询。那么获取“每个不同的 name 的最后一个 timestamp”的好/正确方法是什么?更改数据库结构或添加一些集合是可以的,如果这样更容易的话。

最佳答案

您可以使用聚合框架来实现这一点:

 db.collection.aggregate(
          [
             {$match:
                  {action:'entry'}
             },
             {$group:
                  {_id:'$name',
                   first:
                         {$max:'$timestamp'}
                  }
             }
          ])

如果您可能在结果中包含其他字段,您可以使用 $first运算符(operator)

 db.collection.aggregate(
          [
             {$match:
                  {action:'entry'}
             },
             {$sort:
                  {name:1, timestamp:-1}
             },
             {$group:
                  {_id:'$name',
                   timestamp: {$first:'$timestamp'},
                   otherField: {$first:'$otherField'},
                  }
             }
          ])

关于javascript - 获取具有不同标准的最新文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19114541/

相关文章:

mongodb - 改进具有 $facet 阶段的 MongoDB 查询

javascript - $从文档中的数组中提取

javascript - 所有组合从 aaa 到 ~~~

javascript - 导航栏上的事件 HTML 按钮

node.js - MongoDB 从 $filter 返回一个对象

mongodb - “Robo 3T” 无法打开,因为无法验证开发者

mongodb - Mongo - 如何在单个查询中更新具有不同值的多个文档?

mongodb - 如何使用 Go 更新 Mongodb 中的数组字段

javascript - npm 未安装顶级依赖项的依赖项

Javascript比较多个对象数组