分组在mongoose中给出多个记录

时间:2015-10-17 12:42:14

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我正在尝试通过以下代码

在mongoose中按聚合应用group
app.get('/api/get_conversation_all_carer/:carer_id',function(req,res){
        //Sender = user and receiver = carer
        var data = [];
        var conversation = {status_code:200, data:data};
        Conversation.find({'receiver_id': req.params.carer_id},{sender_id:1},{'group': 'sender_id'},function(err,result)
        {
            console.log(result);
        });
    });

给了我以下输出

[{ _id: 561f985439365e3c2aa9398a,
    sender_id: '55f000a2878075c416ff9879' },
  { _id: 5620cfd0e4b0b1432a7331bb,
    sender_id: '55f000a2878075c416ff9879' }]

这里为同一个sender_id,为什么我得到两个单独的记录 我想发送者_id就像
一样 [{sender_id:'55f000a2878075c416ff9879'}]

2 个答案:

答案 0 :(得分:2)

您希望.aggregate()是一个现代版本,并且可以在没有JavaScript执行或翻译的情况下更好地在本机代码中进行文档操作。我认为您已经在文档中找到了$group,但没有意识到它与.aggregate()相关联,而不是.find()方法:

Conversation.aggregate(
    [
        { "$match": { "receiver_id": req.params.carer_id },
        { "$group": { "_id": "$sender_id" } }
    ],
    function(err,result) {
        console.log(result);
    }
);

这将为_id的“密钥”$group中引用的字段的不同值返回一个结果数组,(即使只有一个),如下所示:

[{_id: '55f000a2878075c416ff9879'}]

您可以选择使用$project_id交换sender_id,但这不是一个好习惯,而是让您的接收逻辑接受“唯一键”始终改为命名为_id

答案 1 :(得分:0)

尝试使用db.collection.group()

Conversation.collection.group(
{
    key: {sender_id:1},
    cond: {receiver_id: req.params.carer_id},
    reduce: function ( curr, result ) { },
    initial: { },
    function(err, results){
        console.log(result);
    }
});