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と「もの」のいくつかの一意のIDを知っています。IDでPersonを取得する方がおそらくはるかに高速です。

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

次に、すべてのものをループして、適切なものを見つけます。

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

私が疑問に思っているのは、もっと良い方法があるかどうかです。IEは、IDでPersonコレクションをクエリして1人のPersonだけを取得し、探しているものだけを(醜いループなしで)除外できますか?

4

1 に答える 1

19

単一のクエリに両方の id 用語を含めることができ、単一要素の射影は引き続き機能します。

Person.findOne({_id: personId, 'things.id': 2}, {'things.$': 1}, 
    function(err, person) { ...
于 2013-03-05T02:34:07.517 に答える