Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在mongo节点中执行或设置条件_Node.js_Mongodb_Express - Fatal编程技术网

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来回答您的问题?如果是这样的话,你可以考虑一下,因为现在其他人在寻找这个问题时,你的问题没有好的答案,可能不读。如果它没有回答你的问题,那么请对遗漏的内容进行评论。我正在检查我的旧答案,如果它们需要改进,我想更新它们。谢谢