2013-03-04 124 views
6

我在猫鼬中有一个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) { ... 

这个伟大的工程,但我通过所有的Person对象(其中可能有很多的)搜索。在这种情况下,我知道我需要的人的身份证和一些'事物'的唯一身份证。它可能是一个速度快了很多的ID来获得人:

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

然后遍历所有的事情找到正确的:

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

我想知道是否有更好的方法是。 I.E.我可以通过id查询Person集合来得到一个Person,然后过滤掉我正在寻找的东西(没有丑陋的循环)?

+9

这是什么东西'$'是什么意思? '$'指的是/做什么? – 2013-12-31 15:14:07

+3

'$'是位置运算符。您可以在[Mongo文档](http://docs.mongodb.org/manual/reference/operator/projection/positional/)中找到更多关于它的细节;) – 2014-10-23 13:38:54

回答

17

您可以在一个单一的查询都ID条款和单个元素投影仍然可以工作。

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

因此,将首先在Person上查询(应该快),那么在那个人的具体事情上?太棒了,谢谢! – lostintranslation 2013-03-05 13:58:41

+0

@forumuser这是正确的,你会从中受益。 – JohnnyHK 2013-03-05 14:05:59

+0

那么这是否意味着只有一个元素在东西数组中返回person对象,那是我们在查询中寻找的东西? – 2015-12-08 15:41:59