MongoDB聚合,geNear和迭代回调

时间:2017-09-26 09:35:59

标签: node.js mongodb foreach geolocation aggregate

我遇到了问题而无法找到解决方案。我有一些MongoSchemas用于存储用户的Geolocation。移动电话每5分钟发送一次经度和纬度。这个API工作得很好。

Mongo-Schema看起来像:

    // Importing Node packages required for schema
const mongoose = require('mongoose');


const Schema = mongoose.Schema;

//= ===============================
// User Schema
//= ===============================
const GeolocationSchema = new Schema({
  loc: {
    type: { type: String },
    coordinates: { type: [Number], index: '2dsphere' }
  },
  user: { type: Schema.Types.ObjectId, ref: 'User' }
},
  {
    timestamps: true
  });

module.exports = mongoose.model('Geolocation', GeolocationSchema);

现在,我想计算附近有“updateAt”的用户 - 时间戳不超过5分钟。这意味着一个或多个用户可以在例如一个距离处。过去500米至5分钟。这应该是一个匹配。为此我使用Mongo聚合,我想迭代回调结果并从结果中提取user._id以构建匹配。

这就是我的尝试:

const Geolocation = require('../models/geolocation')
User = require('../models/user'),    
config = require('../config/main');

exports.setGeolocation = function (req, res, next) {
// Only return one message from each conversation to display as snippet
 console.log(req.user._id);

var geoUpdate = Geolocation.findOneAndUpdate( { user: req.user._id },
      { loc: {      
        type: 'Point', 
        coordinates: req.body.coordinates.split(',').map(Number)
      },
      user: req.user._id
      },
      {upsert: true, new: true, runValidators: true}, // options
      function (err, doc) { // callback
          if (err) {
              console.log(err);
          } 
      });

// create dates for aggregate query
var toDate = new Date( (new Date()).getTime());
var fromDate = new Date( (new Date()).getTime() - 5000 * 60 );    

var match = Geolocation.aggregate([
  {
    $geoNear: {
       near: { 
             type: "Point",
             coordinates: req.body.coordinates.split(',').map(Number)
             },
       distanceField: "dist.calculated",
       maxDistance: 500,        
       includeLocs: "dist.location",
       uniqueDocs: true,
       query: { user: {$ne: req.user._id } , updatedAt: { $gte: fromDate,$lte: toDate }},            
       num: 5,
       spherical: true
    }
  }], function (err, doc){


    //here I´m going in trouble correctly parsing doc

    var str = JSON.stringify(doc);
    var newString = str.substring(1, str.length-1);                 
    var response = JSON.parse(newString);

    console.log(response.user);

  });      

  res.sendStatus(200);  
};

正如您所看到的,在解析“doc”-callback以迭代文档时遇到了麻烦。如果我想将其解析为jSON,我在位置1上得到一个令牌错误。如果我有超过2个结果,我在位置288上得到错误。

这就是为什么我试图解析和字符串化“doc”。但这不能正常工作。

也许,有人可以帮我解决问题。我不熟悉mongo函数,因为我从它开始,也许有一个更好的解决方案,但我找不到别的东西来计算geoNear并事后迭代结果。

总而言之,谁能提供帮助...

0 个答案:

没有答案