使用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
。 然后我想返回具有最近tipID
的reply
的tipID
。
我是新来的 – 一般来说编码很好。 会爱如何最好地解决这个问题的任何指针。
这是一个Mongoose的重复问题- 通过标准查找子文档
对于您的具体问题,mongoose子文档的诀窍是双重的:
a)如果可以的话,避免在子文档中嵌套,即不要将属性嵌套在propId
而propId
这些属性直接放入回复中,不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。