【问题标题】:How to perform or condition in mongo node如何在 mongo 节点中执行或条件
【发布时间】:2017-01-29 18:10:08
【问题描述】:

我使用以下代码执行或条件,但它产生重复,我认为我错了或条件任何人都可以建议帮助...。

     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: []
            };
        }

    })
    //

我使用以下代码执行或条件,但它产生重复,我认为我错了或条件任何人都可以建议帮助...。

【问题讨论】:

  • my post below 回答您的问题了吗?如果确实如此,那么您可以考虑accepting the answer,因为现在其他搜索此问题的人看到您的问题没有好的答案并且可能不会阅读。如果它没有回答您的问题,请评论缺少的内容。我正在查看我的旧答案,如果他们需要任何改进,我想更新它们。谢谢。

标签: node.js mongodb express


【解决方案1】:

我怀疑你运行代码时你的profiles数组不为空。

为什么您将结果推送到数组并解析空承诺而不是使用承诺返回数据?

我想知道你为什么使用:

profiles.push(resp)
resolve()

代替:

resolve(resp);

您没有包含使用 Promise 的代码,因此无法再说什么。这只是一个猜测,数组可能一开始就不是空的。

要查看您从数据库中获得了什么,您可以将数据记录在 if (resp) { ... } 块中,如下所示:

console.log(JSON.stringify(resp));

更新

在您将代码的第二部分添加到您的问题之后,我更加怀疑。您是否从数据库中获取所有用户配置文件,然后为每个用户搜索在其 sent_idrecieved_id 字段中包含配置文件 ID 的配置文件?对数据库的请求似乎很多。

您可能可以对单个请求执行相同的操作,而不是:

{ $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) { ... } 块内的类似内容。

(顺便问一下,你确定你数据库中的字段叫“recieved_id”而不是“received_id”吗?)

【讨论】:

  • rsp,我正在另一个中使用这些功能,我将编辑我的代码
  • @klp 在您向问题添加更多代码后,我更新了我的答案。
  • @rsp 这就是Chameleon Questions的问题
  • @chridam 好点。而且您永远不知道何时发布答案只是为了更新问题的代码量是以前的两倍。我最好的cameleon问题总结在those comments
  • 用你的代码我得到了错误,,,,,,, $in 需要一个数组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2018-12-25
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多