node.js - 需要为每个用户获取一份文档nodejs和mongodb

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

我有以下结构的文档:-

{
"_id" : ObjectId("585d64f356ec921620c5d7c5"),
"createdAt" : ISODate("2016-12-23T17:54:59.193Z"),
"updatedAt" : ISODate("2016-12-23T17:54:59.193Z"),
"userid" : ObjectId("5850f42b9a8ea0a43c1355b8"),
"destination" : {
    "id" : ObjectId("584fdcf0e6be59514784e9d4"),
    "lineid" : ObjectId("584f8ddd433c5703acf2618f")
},
"source" : {
    "id" : ObjectId("584fdda2e6be59514784e9df"),
    "lineid" : ObjectId("584fdd2fe6be59514784e9d8")
},
"__v" : 0

}

它们是具有相同结构但重复“userid”字段的多个文档。 现在我想获取符合条件的文档,但每个用户只能获取一个文档。我尝试使用“查找”查询、“聚合”和“组”,但没有成功。

我可以使用此查询获取记录,但结果数组具有同一用户的多个文档。

    Route.find({
    $and : [ {
        $or : [ {
            'source.lineid' : request.payload.sourcelineid
        }, {
            'destination.lineid' : request.payload.destinationlineid
        }, {
            'source.id' : request.payload.source
        }, {
            'destination.id' : request.payload.destination
        } ]
    }, {
        userid : {
            $ne : request.user._id
        }
    } ]
}).sort({
    createdAt : -1
})
.exec(function(err, sameroutes) {
    if (err) {
        reply(err).code(500);
    } else {
        reply(sameroutes).code(200);
    }
});

最佳答案

使用aggregate() 方法,您可以对每个用户的文档进行分组并使用 $first 返回字段 $last 累加器运算符。

过滤可以作为初始完成 管道阶段使用 $match 它使用标准 MongoDB 查询。运行以下管道应该会给您带来所需的结果:

Route.aggregate([
    {
        "$match": {
            "userid": { "$ne": request.user._id },
            "$or": [
                { "source.lineid": request.payload.sourcelineid }, 
                { "destination.lineid" : request.payload.destinationlineid }, 
                { "source.id" : request.payload.source }, 
                { "destination.id" : request.payload.destination }
            ]
        }
    },
    { "$sort": { "userid": 1, "createdAt": -1 } },
    {
        "$group": {
            "_id": "$userid",
            "doc_id": { "$first": "$_id" },
            "createdAt": { "$first": "$createdAt" },
            "updatedAt": { "$first": "$updatedAt" },            
            "destination": { "$first": "$destination" },
            "source": { "$first": "$source" }
        }
    }
]).exec(function(err, sameroutes) {
    if (err) {
        reply(err).code(500);
    } else {
        reply(sameroutes).code(200);
    }
});

关于node.js - 需要为每个用户获取一份文档nodejs和mongodb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41429679/

相关文章:

java - MongoDB: "can' t 保存部分对象”异常

mongodb - Mongoose 聚合 $match 不匹配 id

mongodb - 如何使用组和累加器阶段改进 MongoDB 聚合?

mongodb - 查找数组中所有元素都具有特定值的文档

node.js - 使用 Mongoose 制作验证器的正确方法是什么

mongodb无法启动

javascript - NodeJS - mysql 包尊重完成 INSERT INTO...SET 后的列名称?

node.js - 如何在mongodb查询中使用变量作为字段值?

javascript - firebase 功能无法部署。意外的代币功能

node.js - React-native Undefined 不是一个对象(评估 'RNI18n.locale' )