我需要使用 mongodb 本机驱动程序来查找按时间戳字段排序的不同 ID
I need to use mongodb native driver to find distinct ids ordered by a timestamp field
我正在使用 nodejs mongodb 本机驱动程序。我正在写一个聊天程序。我有一个名为对话框的集合,它具有 sessionId 和 dateCreated(时间戳)字段。我需要一个按最后(最大)dateCreated 时间戳排序的不同 sessionIds 列表。我还需要 20 条记录的限制。
这是我目前所拥有的(显然缺少顺序):
db.collection('dialog').distinct('sessionId',
function(err, users){
if(users.length > 10){
users = users.slice(0, 20);
}
console.log("users: " + users);
});
这里有一些文档。
{
"sessionId" : 455206183,
"msg" : "hi what's up?",
"dateCreated" : ISODate("2015-02-05T20:17:55.418Z"),
"_id" : ObjectId("54d3cff30e3ddb6922fbc2bb")
}, {
"sessionId" : 163220612,
"msg" : "yo",
"dateCreated" : ISODate("2015-02-05T20:18:00.434Z"),
"_id" : ObjectId("54d3cff80e3ddb6922fbc2bc")
}
正如评论中所指出的,您可能需要聚合才能获得所需的结果。以下内容可能适合您:
db.dialog.aggregate([
{ $sort: { "$dateCreated": -1, "$sessionId": 1 }},
{ $group: { _id: "$sessionId", dateCreated: {$first: "$dateCreated"} }},
{ $limit: 20 },
{ $project: { sessionId: 1, _id: 0 }}
]);
这里我们首先按dateCreated
和sessionId
对集合进行排序,按不同的id对它们进行分组,然后选择dateCreated
中的$first(最新的) ,将结果限制为 20 和 return 个对象数组,每个对象仅包含 sessionId 值。
请注意,我没有尝试过这个,所以请告诉我它是否适合你。
Olli K 让我朝着正确的方向前进。在 group by 之后进行排序似乎可以正常工作。
db.collection('dialog').aggregate([
{$group: {_id:"$sessionId", dateCreated: {$first: "$dateCreated"} }},
{$sort: {"dateCreated":-1}},
{$limit: 20}],
function(error, users){
//do stuff
});
我正在使用 nodejs mongodb 本机驱动程序。我正在写一个聊天程序。我有一个名为对话框的集合,它具有 sessionId 和 dateCreated(时间戳)字段。我需要一个按最后(最大)dateCreated 时间戳排序的不同 sessionIds 列表。我还需要 20 条记录的限制。
这是我目前所拥有的(显然缺少顺序):
db.collection('dialog').distinct('sessionId',
function(err, users){
if(users.length > 10){
users = users.slice(0, 20);
}
console.log("users: " + users);
});
这里有一些文档。
{
"sessionId" : 455206183,
"msg" : "hi what's up?",
"dateCreated" : ISODate("2015-02-05T20:17:55.418Z"),
"_id" : ObjectId("54d3cff30e3ddb6922fbc2bb")
}, {
"sessionId" : 163220612,
"msg" : "yo",
"dateCreated" : ISODate("2015-02-05T20:18:00.434Z"),
"_id" : ObjectId("54d3cff80e3ddb6922fbc2bc")
}
正如评论中所指出的,您可能需要聚合才能获得所需的结果。以下内容可能适合您:
db.dialog.aggregate([
{ $sort: { "$dateCreated": -1, "$sessionId": 1 }},
{ $group: { _id: "$sessionId", dateCreated: {$first: "$dateCreated"} }},
{ $limit: 20 },
{ $project: { sessionId: 1, _id: 0 }}
]);
这里我们首先按dateCreated
和sessionId
对集合进行排序,按不同的id对它们进行分组,然后选择dateCreated
中的$first(最新的) ,将结果限制为 20 和 return 个对象数组,每个对象仅包含 sessionId 值。
请注意,我没有尝试过这个,所以请告诉我它是否适合你。
Olli K 让我朝着正确的方向前进。在 group by 之后进行排序似乎可以正常工作。
db.collection('dialog').aggregate([
{$group: {_id:"$sessionId", dateCreated: {$first: "$dateCreated"} }},
{$sort: {"dateCreated":-1}},
{$limit: 20}],
function(error, users){
//do stuff
});