我遇到了问题而无法找到解决方案。我有一些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并事后迭代结果。
总而言之,谁能提供帮助...