Mongoose聚合字段结果到数组

时间:2015-10-09 06:56:57

标签: node.js mongodb mongoose mongodb-query

我目前正在使用以下代码来筛选两个单独的集合。一个集合包含发送给用户的消息总列表。第二个集合包含来自用户的所有响应。

从第一个集合开始,我正在构建一个发送的消息数组 - 然后查询第二个集合以搜索该数组中没有匹配项的所有响应。

两个问题:

1)有没有比我正在使用的for循环方法更好的方法将Mongoose / MongoDB结果输出到数组中?

2)有没有比我正在使用的更好的方法来比较这些集合?

// Find all responses (read) messages associated with a patient.
Response.find({patientID: patientID}, function(err, responses){

    // Store all msgIDs into an array.
    for (var i = 0; i < responses.length; i++){
        openedArray.push(responses[i].msgID);
    }

    // Find all messages associated with that same patient, but that were not included in the response list
    Message.find({patientList: patientID, msgID: { $ne: openedArray}}, function(err, unopenedMessages){

        // Store all msgIDs into an array.
        for (var j = 0; j < unopenedMessages.length; j++){
            unopenedArray.push(unopenedMessages[j].msgID);
        }

        // Output a list of unopened messages (msgIDs) and a count of total unread messages
        res.json({unread: unopenedArray, count: unopenedArray.length})
   });
});

1 个答案:

答案 0 :(得分:1)

您可以使用.distinct()以及async.waterfall的一些用法来清理嵌套:

async.waterfall(
    [
        function(callback) {
            Response.distinct("msgID",{ "patientID": patientID },callback);
        },
        function(opened,callback) {
            Message.distinct(
                "msgID",
                {
                    "patientList": patientID,
                    "msgID": { "$nin": opened }
                },
                callback
            );
        }
    ],
    function(err,unopened) {
        // maybe handle error
        res.json({ "unopened": unopened, "count": unopened.length });
    }
);

此外,您可能希望$nin用于比较返回的列表与第二个集合中的字段。

waterfall将每个异步调用的结果传递给下一个阶段,这意味着您不需要将每个调用嵌套在另一个调用中,因此它看起来更清晰。