2013-03-04 120 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