将两个查询结果传递给响应

时间:2015-08-26 01:13:11

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有一个查询,可以获取排行榜的前5名用户。在robomongo中,此查询可以正常工作。

当我做

之类的事情时
 public class SizeAwareImageView extends ImageView {
        MainActivity m_mainActivity;

        public SizeAwareImageView(Context context,AttributeSet attrss){
            super(context,attrss);
            m_mainActivity = (MainActivity)context;
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);

            if(m_mainActivity.getTextMeasured())return;
            // Get image matrix values and place them in an array
            float[] f = new float[9];
            getImageMatrix().getValues(f);

            // Extract the scale values using the constants (if aspect ratio maintained, scaleX == scaleY)
            final float scaleX = f[Matrix.MSCALE_X];
            final float scaleY = f[Matrix.MSCALE_Y];

            // Get the drawable (could also get the bitmap behind the drawable and getWidth/getHeight)
            final Drawable d = getDrawable();
            final int origW = d.getIntrinsicWidth();
            final int origH = d.getIntrinsicHeight();

            // Calculate the actual dimensions
            final int actW = Math.round(origW * scaleX);
            final int actH = Math.round(origH * scaleY);

            int top = (int) (imgViewH - actH)/2;
            int left = (int) (imgViewW - actW)/2;

            if(origW!=actW){
                m_mainActivity.setTextMeasured(true);
            m_mainActivity.setTextLayout(origW, origH, actW, actH,top,left);
            }

        }
    }

我的[对象]几乎到处都有很多无意义的json。

如何执行此查询以与mongoose + express一起使用,以便我可以作为数组

传递给视图
var leaderboard = User.find({points: {$exists: true}}, {
    "firstname": 1,
    "lastname": 1,
    "points": 1
}).sort({points : -1}).limit(5)
 console.log('leaderboard');

所以我可以在视图中循环它吗?

我的完整代码是

firstname, lastname, points 

1 个答案:

答案 0 :(得分:1)

所以你真的只在这里返回游标而不是执行查询。你当然可以总是嵌套查询,但你可以更好一些,并使用async.waterfall来避免缩进。

此外,我会使用.aggregate()而不是循环所有文档只是为了得到一个总数。并且mongoose会自动将结果转换为数组,因此此处不需要.toArray()

app.get('/dashboard', function(req, res){

  if (req.user) {
    // logged in

    async.waterfall(
      [
        function(callback) {
          User.find(
            { "points": { "$exists": true } },
            {
              "firstname": 1,
              "lastname": 1,
              "points": 1
            }
          ).sort({points : -1}).limit(5).exec(callback);
        },
        function(leaderboard,callback) {
          User.aggregate(
            [
              { "$match": { "points": { "$exists": true } }},
              { "$group": {
                "_id": null,
                "totalpoints": { "$sum": "$points" }
              }}
            ],
            function(err,result) {
              callback(err,result,leaderboard)
            }
          );
        }
      ],
      function(err,result,leaderboard) {
        if (err) {
            console.log(err);
            //do error handling
        } else {
          res.render('dashboard', {
            title: 'Dashboard',
            user: req.user,
            totalpoints: result[0].totalpoints,
            leaderboard: leaderboard
          });
        }
      }
    );
  } else {
    // not logged in
    return res.redirect('/login');
  }

});

因此,您获得了leaderboard结果并将其放入响应中,就像此处示例中所做的那样。

另一种方法是使用async.parallel,因为您不需要在第二个查询中输出第一个查询。在这种情况下,两个查询的结果最后都会发送到回调,就像上面一样。您只需在最终回复中使用结果。

app.get('/dashboard', function(req, res){

  if (req.user) {
    // logged in

    async.parallel(
      {
        "leaderboard": function(callback) {
          User.find(
            { "points": { "$exists": true } },
            {
              "firstname": 1,
              "lastname": 1,
              "points": 1
            }
          ).sort({points : -1}).limit(5).exec(callback);
        },
        "totalpoints":function(callback) {
          User.aggregate(
            [
              { "$match": { "points": { "$exists": true } }},
              { "$group": {
                "_id": null,
                "totalpoints": { "$sum": "$points" }
              }}
            ],
            function(err,result) {
              callback(err,result[0].totalpoints)
            }
          );
        }
      },
      function(err,results) {
        if (err) {
            console.log(err);
            //do error handling
        } else {
          res.render('dashboard', {
            title: 'Dashboard',
            user: req.user,
            totalpoints: results.totalpoints,
            leaderboard: results.leaderboard
          });
        }
      }
    );
  } else {
    // not logged in
    return res.redirect('/login');
  }

});