Node.js 如何在mongo节点中执行或设置条件
我执行了以下代码或条件,但它是生产重复,我认为我在或条件错误,任何人可以建议帮助请Node.js 如何在mongo节点中执行或设置条件,node.js,mongodb,express,Node.js,Mongodb,Express,我执行了以下代码或条件,但它是生产重复,我认为我在或条件错误,任何人可以建议帮助请 function get_profile (id, profiles) { return new Promise(function (resolve, reject) { var requests = db.collection('requests'); var item = { $or: [ {'sent_id':id}, {'reci
function get_profile (id, profiles) {
return new Promise(function (resolve, reject) {
var requests = db.collection('requests');
var item = { $or: [ {'sent_id':id}, {'recieved_id':id } ] }
requests.find( item ).toArray((err, resp) => {
if (err) {
reject(err)
return
}
if (resp) {
profiles.push(resp)
resolve()
} else {
reject()
}
});
})
}
}
exports.getprofiledatalistbyid = function(req, res) {
var params = req.params;
var record = db.collection('profile');
record.find().toArray((err, result) => {
if (err) {
return
}
if (result) {
var profiles_to_get = []
var profiles = []
for (var i in result) {
var id = result[i]._id;console.log(id)
var id = id.toString();
profiles_to_get.push(get_profile(id, profiles))
// console.log(profiles_to_get)
}
Promise.all(profiles_to_get)
.then(() => {
console.log(profiles_to_get)
res.send({status: 'success', data: profiles});
})
} //end of if loop
else {
response = {
status: 'fail',
data: []
};
}
})
//
我用下面的代码执行了或条件,但它产生了重复项,我认为我在或条件上错了,请任何人建议帮助……我怀疑在运行代码时您的配置文件数组不是空的
function get_profile (id, profiles) {
return new Promise(function (resolve, reject) {
var requests = db.collection('requests');
var item = { $or: [ {'sent_id':id}, {'recieved_id':id } ] }
requests.find( item ).toArray((err, resp) => {
if (err) {
reject(err)
return
}
if (resp) {
profiles.push(resp)
resolve()
} else {
reject()
}
});
})
}
}
exports.getprofiledatalistbyid = function(req, res) {
var params = req.params;
var record = db.collection('profile');
record.find().toArray((err, result) => {
if (err) {
return
}
if (result) {
var profiles_to_get = []
var profiles = []
for (var i in result) {
var id = result[i]._id;console.log(id)
var id = id.toString();
profiles_to_get.push(get_profile(id, profiles))
// console.log(profiles_to_get)
}
Promise.all(profiles_to_get)
.then(() => {
console.log(profiles_to_get)
res.send({status: 'success', data: profiles});
})
} //end of if loop
else {
response = {
status: 'fail',
data: []
};
}
})
//
为什么将结果推送到数组并解析空承诺而不是使用承诺返回数据
我想知道你为什么使用:
profiles.push(resp)
resolve()
而不是:
resolve(resp);
{ $or: [ {sent_id: id}, {recieved_id: id } ] }
您没有包含使用承诺的代码,因此无法再多说。这只是一个猜测,数组一开始可能不是空的
要查看从数据库中获得的信息,可以使用以下方法记录if resp{…}块中的数据:
console.log(JSON.stringify(resp));
使现代化
在您将代码的第二部分添加到问题之后,我有更多的疑问。您是否从数据库中获取所有用户配置文件,然后为每个用户配置文件搜索在其“发送id”或“接收id”字段中包含配置文件id的配置文件?这似乎是对数据库的大量请求
您可能可以对单个请求执行相同的操作,而不是:
resolve(resp);
{ $or: [ {sent_id: id}, {recieved_id: id } ] }
您使用:
{ $or: [ {sent_id: {$in: ids} }, {recieved_id: {$in: ids} } ] }
其中,ids是要获取的所有id的数组
您可能只需使用以下工具即可获得ID列表:
var ids = result.map(i => i._id);
或者类似于if result{…}块中的内容
顺便问一下,您确定数据库中的字段名为received_id和not received_id吗?rsp,我正在另一个数据库中使用这些函数,我将编辑我的code@klp在您为问题添加了更多代码后,我更新了答案。@rsp这就是@chridam Good point的问题所在。你永远不知道什么时候你发布了一个答案,却得到了比以前两倍的更新。我最好的cameleon问题总结在中。使用您的代码,我得到了错误,,,,,,,,$in需要一个arrayDid来回答您的问题?如果是这样的话,你可以考虑一下,因为现在其他人在寻找这个问题时,你的问题没有好的答案,可能不读。如果它没有回答你的问题,那么请对遗漏的内容进行评论。我正在检查我的旧答案,如果它们需要改进,我想更新它们。谢谢