使用$ in时,只获取每个id的最后创建的文档

时间:2018-02-19 19:32:55

标签: mongodb mongoose

我在MongoDB中有10,000个读数(文档),我有一个deviceIds数组。我需要为Mongoose提供最后为每个设备创建的文档。

我的方法:

    Reading.find({
        "deviceId": { "$in": deviceIds} 
    },
    function(err, readings) {
         callback(err,readings);
    }).sort({createdAt:-1}).limit(1);

这显然只返回一个文档。我需要在deviceIds数组中为每个deviceId获取一个。

编辑21/02/2018:感谢@mickl的帮助,我将代码更改为:

Reading.aggregate([
    {   $match: { "deviceId": { "$in": finalDevices}  } },
    {
        $group: {
            deviceId: "$deviceId",
            maxCreatedAt: { $max: "$createdAt" }
        }
    }
],function(err, reading) {
    if (err) {
        callback(err, null);
    } else {
        callback(null, reading)
    }
})

现在我收到以下错误:"字段' deviceId'必须是累加器对象"

1 个答案:

答案 0 :(得分:1)

您可以使用汇总框架$match将您的收藏集过滤到指定的设备,然后使用$group$max一起获取日期。

Device.aggregate([
    { $match: { "deviceId": { "$in": deviceIds}  } },
    {
        $group: {
            _id: "$deviceId",
            maxCreatedAt: { $max: "$createdAt" }
        }
    }
],function(err, readings) {
         callback(err,readings);
})