0

コレクション:

[
{
   tracks: [{_id: 'xxx', title: 'track x'}, {_id: 'yyy', title: 'track y'}
},
{
   tracks: [{_id: 'zzz', title: 'track z'}, {_id: 'ttt', , title: 'track t'}
}
]

IDxxxとzzzのトラックのみを含む結果セットを取得したい:

tracks: [{_id: 'xxx'}, {_id: 'zzz'}

集計フレームワークを試してみました:

{$unwind : "$tracks" },
{$match: {'tracks._id': {$in:['xxx', 'zzz']}} }

しかし、それは空のセットを返します[]

私にとって奇妙なことは、別の(_idではないフィールド)と一致させようとすると、それが機能することです。

{$unwind : "$tracks" },
{$match: {'tracks.title': {$in:['track x', 'track x']}} }

どうすれば自分のタスクを達成できますか?

PS私はmongoose.jsフレームワークを使用してクエリを作成します。

4

2 に答える 2

1

だから私は問題を理解しました:_idで選択するには、id値をネイティブObjectIdタイプに明示的にキャストする必要があります。

var ObjectId = mongoose.Types.ObjectId
...
{$unwind : "$tracks" },
{$match: {'tracks._id': {$in:[ObjectId('5140a09be5c703ac2c000002'), ObjectId('5140a09be5c703ac2c000002')]}} }

バグだと思います。mongoose.jsリポジトリで問題を作成しました。

UPD。mongoose.jsの寄稿者からの問題への回答:現時点では、$ project演算子を使用すると、パイプラインの任意の段階でドキュメントの「形状」を再定義できるため、引数はスキーマにキャストされません。-返されるドキュメントはプレーンなjavascriptオブジェクトであり、このモデルのスキーマ定義にキャストされたマングースドキュメントではありません(任意の形状のドキュメントを返すことができるため)。

于 2013-03-24T22:51:08.703 に答える
0

あなたのクエリには何も問題はありませんが、それはうまくいくはずです(ただし、私はマングースを使用したことがありません)。ただしfind()、プロジェクションで使用して、同様の結果を得ることができます。

db.tracks.find(
  { 'tracks._id': { $in: [ 'xxx', 'zzz' ] } }, 
  { _id: 0, 'tracks.title': 0, tracks: { $elemMatch: { _id: { $in: [ 'xxx', 'zzz' ] } } }
)  
于 2013-03-24T11:48:51.877 に答える