2016-10-19 43 views
0

我想要做一些非常简单的事情,但对MongoDB来说是一个新东西!我有一个名为Device的文档和一个名为Movement的子文档。我想从last_seen(日期)订购的设备中获取最后两个移动子文档。这是我与我正在沿着错误有:使用猫鼬对子文档进行排序(MongoDB)

Device.findOne({device_id: "1234"}, {movements: { $sort: {last_seen: -1}, $slice: 2 }}, function(err, device){ 
    ... 
}); 

的错误:

MongoError: >1 field in obj: { $sort: { last_seen: -1 }, $slice: 2 }

+0

请张贴有效样本文件。 – Saleem

回答

0

您可以使用aggregate

Device.aggregate(
    { $match: { device_id: "1234"}}, // query documents (can return more than one element) 
    { $unwind: '$movements'}, //deconstruct the documents 
    { $sort: { '$movements.last_seen': -1}}, 
    { $limit: 2 }, 
    { $group: { _id: '$device_id', movements: { $push: '$movements }}} //reconstruct the documents 
function(err, devices){ 
    //returns an array, probably with one elements depending on `$match` query 
}); 
+0

下面是我从中得到的结果:MongoError:$ sort键规范必须是一个对象 – gregwinn

+0

另外我注意到,在重建中,只有ID和运动正在进入。我想显示所有设备数据,我是否必须指定我想展示的每件东西,还是有“全部”选择​​。 – gregwinn

+0

@gregwinn修复$ sort。关于重建,你必须指定你想要的每个领域。在你的情况下,除了因运动放松而产生的“移动”外,所有字段都是相同的,你可以将它们包含在'_id:{device_id:'$ device_id',field1:'$ field1'等'_id'中。 。},动作:...}'。之后,您可以使用投影删除_id嵌套,如果你想。 –