我目前正在使用以下代码来筛选两个单独的集合。一个集合包含发送给用户的消息总列表。第二个集合包含来自用户的所有响应。
从第一个集合开始,我正在构建一个发送的消息数组 - 然后查询第二个集合以搜索该数组中没有匹配项的所有响应。
两个问题:
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})
});
});
答案 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
将每个异步调用的结果传递给下一个阶段,这意味着您不需要将每个调用嵌套在另一个调用中,因此它看起来更清晰。