【发布时间】:2013-10-01 11:04:39
【问题描述】:
情况
我在想出一个很好的方法来执行某个 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”的好/正确方法是什么?更改数据库结构或添加一些集合是可以的,如果这样做更容易的话。
【问题讨论】:
-
...在有人指出之前,是的,
name是一种糟糕的识别人的方法,但这只是示例代码。如果这让您感到困扰,请假设具有相同姓名的新人必须在获得卡片之前更改他们的姓名;)
标签: javascript mongodb mongodb-query