查找基于数组元素的对象,只返回匹配的数组元素?

我在mongoose中有一个Person对象,而这个person对象有多个东西(每个东西都有一个唯一的ID)。

person1 = { things[{id: 1, name: 'one'},{id:2, name: 'two'}] } person2 = { things[{id: 3, name: 'three'},{id:4, name: 'four'}] } 

然后查询:

 Person.findOne({'things.id': 2},{'things.$': 1}, function(err, person) { ... 

这工作很好,但我正在通过所有的人物对象(可能会有很多)。 在这种情况下,我知道我需要的人的身份证和一些“事物”的唯一标识。 它可能要快得多的人通过ID:

 Person.findById(personId, function(err, person) { ... 

然后循环所有的东西find正确的一个:

 var thing person.things.forEach(function(t) { if (t.id == thingId) { thing = t; } }); 

我想知道的是,如果有更好的方法。 IE浏览器我可以查询个人集合的身份证得到只有一个人,然后筛选出我正在寻找的东西(没有丑陋的循环)?

您可以在单个查询中包含这两个id项,单个元素投影仍然可以工作:

 Person.findOne({_id: personId, 'things.id': 2}, {'things.$': 1}, function(err, person) { ...