如何通过在$ 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它,我会添加更多的细节。 或者,如果其他人想扩大答案 – 我宁愿接受,而不是我自己的。