如何通过在$ project中提供的_id与$ mongodb聚合进行$匹配?

我想要能够匹配/过滤来自whiskey.style的特定风格。

我想知道是否由于OID的格式不匹配。 我试图toString()作为文件似乎build议 – 可能需要调查这更多..

这是我的查询/ $匹配对象

var qObj.whiskeyFilter = { whiskey: { style: '57953144abfaa62383341a72' }, _id: { '$in': [ 57a115304d124a4d1ad12d81, 57a114d64d124a4d1ad12d7f, 57a1152a4d124a4d1ad12d80, 57a9049906f3733623826538 ] } } 

我的pipe道:

  var pipeline = [ { "$project": { "weight": stack[0], "whiskey": "$$ROOT", "collection": collect[0] } }, { "$match": qObj.whiskeyFilter }, { "$sort": { "weight": 1 } }, { "$limit": 12 }, { "$skip": qObj.skip }]; 

这个工程,如果我只包括_id / $为$匹配,但不会与$ whisky.style匹配。

这里是一个聚合返回的例子:

 [ { _id: 57a115304d124a4d1ad12d81, weight: 1, whiskey: { _id: 57a115304d124a4d1ad12d81, name: 'sample whiskey 2', distiller: 578c04f76091bcd618f26e04, style: 57953144abfaa62383341a72, userVote: 0, timestamp: Tue Aug 02 2016 16:48:32 GMT-0500 (CDT), total: 1, vote: 2, __v: 0 }, collection: { _id: 57acb4ff093360bee276aae6, user: 57919ac16fa0390856a9998f, whiskey: 57a115304d124a4d1ad12d81, __v: 0, collected: true, vote: 1, timestamp: Thu Aug 11 2016 12:25:19 GMT-0500 (CDT), favorite: true } } ] 

更新

我把它转换成一个objectId,因为我读过聚合可能会有问题转换为string,但我仍然没有得到任何预期的匹配返回:

 mongoose.Types.ObjectId(obj.style); 

现在,你可以看到,样式Id不再是一个string,但仍然$匹配似乎不工作:

 match query : { whiskey: { style: 57953144abfaa62383341a72 }, _id: { '$in': [ 57a115304d124a4d1ad12d81, 57a114d64d124a4d1ad12d7f, 57a1152a4d124a4d1ad12d80, 57a9049906f3733623826538 ] } } 

弄清楚了:

我不得不修改和添加我的风格来过滤在主对象/不嵌套

  { "$project": { "weight": stack[0], "whiskey": "$$ROOT", "style": "$style", <--- added "collection": collect[0] } 

出于某种原因,它不能过滤嵌套$$ ROOT对象。

如果我可以在文档中find它,我会添加更多的细节。 或者,如果其他人想扩大答案 – 我宁愿接受,而不是我自己的。