使用mongoose基于它的一个属性返回一个子文档

使用mongoose,我想要search具有特定属性的子文档,并返回最近的一个。

// the relevant part of the user schema id: String, __history__: { reply: [] } // the components of a 'reply' (not defined by a schema) id: String, createdAt: Date, props { tipID: String } 

给定一个特定的用户 id ,我想search他们的reply[] s的回复,在他们的props tipID 。 然后我想返回具有最近tipIDreplytipID

我是新来的 – 一般来说编码很好。 会爱如何最好地解决这个问题的任何指针。

这是一个Mongoose的重复问题- 通过标准查找子文档

对于您的具体问题,mongoose子文档的诀窍是双重的:

a)如果可以的话,避免在子文档中嵌套,即不要将属性嵌套在propIdpropId这些属性直接放入回复中,不pipe它们是什么。

b) $elemMatch的重复答案中的build议使用$elemMatch 。 这将确保mongoDbfind正确的文档,因为mongoDb将{a:1,b:2}{b:2,a:1}识别为两个不同的子文档。

如果你只find一个文件,然后组织答复是这样的..

 // find your doc by ID user.findOne({ id: id }, function(err, doc) { // sort replies by createdAt date var replies = _.sortBy(doc.reply, function(reply) { return reply.createdAt.getTime(); // convert to seconds from jan 1, 1970 }); return replies[0].props.tipId; }) 

因为$ elemMatch返回一个错误(我认为是因为答复不是一个适当的模式定义文档),我得到了以下工作。

 User.findOne("_id": user._id}, function (err, doc) { var replies = doc.__history__.reply; for ( var i = 0; i < replies.length; i++ ) { if (replies[i].props.hasOwnProperty("tipId")) { // do something break; // stop because i only wanted the first hit } } 

注意:我不必担心按时间sorting,因为__history__.reply项目已经被最近的sorting。