我有2个收藏品 1.用户:
{
"_id": "111",
...,
"type": 1
}
2。查询:
{
"_id": {
"$oid": "58bbf5bf17cc9100046b0dff"
},
"query": "some query",
"user_id": "111",
"links": []
}
我想要选择的内容:某些特殊用户类型的所有查询。 现在我选择具有某种用户类型的所有用户并将其所有查询作为字段包含在内 - 这实际上并不是我需要的。
db.collection('user').aggregate([
{$match : {'type': userType}},
{$lookup: {from: 'query', localField: '_id', foreignField: 'user_id', as: 'queries'}},
{$unwind: '$queries'}
], function(err, results) {...});
感谢。
修改
示例:我想为type
1
的用户选择所有查询。所以期望输出就像:
[{
"_id": {
"$oid": "58bbf5bf17cc9100046b0dff"
},
"query": "some query",
"user_id": "111",
"links": []
},
{
"_id": {
"$oid": "58bbf5bf17cc9100046b0dff"
},
"query": "some query",
"user_id": "111",
"links": []
}]
答案 0 :(得分:2)
通过2个不同的查询来实现这一目标会更容易:
_id
列表
这是一个示例脚本:
// filter users, and push all matching _id in listId field
var cursor = db.user.aggregate([{$match: {type: 1}}, {$group: {_id: null, listId: {$push: "$_id"}}}]);
if (cursor != null && cursor.hasNext()) {
var listId = cursor.next().listId;
// find queries where user_id is in listId
var result = db.query.find({user_id: {$in: listId}});
if (result != null && result.hasNext()) {
while (result.hasNext()) {
print(JSON.stringify(result.next()));
}
}
}
运行它,将代码粘贴到名为script.js
的文件中,然后从shell运行
mongo databaseName < script.js
答案 1 :(得分:1)
您可以尝试以下聚合。
db.collection('user').aggregate([
{$match : {'type': userType}},
{$lookup: {from: 'query', localField: '_id', foreignField: 'user_id', as: 'queries'}},
{$unwind: '$queries'},
{$replaceRoot:{newRoot:"$queries"}}
]