mongodb聚合 - 选择特殊条件

时间:2017-03-07 03:18:01

标签: javascript mongodb

我有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": []
}]

2 个答案:

答案 0 :(得分:2)

通过2个不同的查询来实现这一目标会更容易:

  1. 获取具有所需类型
  2. 的用户_id列表
  3. 获取userId在列表中的所有查询
  4. 这是一个示例脚本:

    // 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"}}
    ]