【发布时间】:2015-11-04 14:12:42
【问题描述】:
一旦用户登录他/她的位置就会被报告。并继续每隔 15 分钟报告当前用户的位置。或者至少直到他们的会话结束。使用 Locate 方法将用户位置读入数据库。它存储在与该特定用户关联的数据库中的位置数组中。这一切都很好。
将使用扫描方法从数据库中读取用户位置。
我想知道如何围绕 location.coordinates 创建一个 2dsphere。我知道我必须以 location.coordinates 为目标,所以 mongo 知道将其视为 2dsphere。所以我知道我必须使用 User.ensureIndex({location: "2dsphere"})。我的问题/问题是:
1st) 应该是 User.ensureIndex("location.coordinate": 2dsphere) 还是 ("location": 2dsphere)。这会出现在 app.js 的顶部吗?
2nd)在我的扫描方法中,我试图创建逻辑并查询用户名匹配的文档,除了在 300 米之内。所以最后我的问题是我的最后一个 Mongo 查询结构正确
这是我的 mongo 架构的样子:
var userSchema = mongoose.Schema({
username: {
type: String,
required: true,
unique: true
},
password: {
type: String,
required: true
},
email: {
type: String
},
location:
{
type: "Point",
coordinates: [Number, Number],
datetime: Date
},
points: {type:Number, default:10000},
imageUrl: {type:String, default:'/img/gravatar.jpg'}
});
这就是我的 app.js 的设置方式:
var User = require('../models/users.js');
var userController = {
locate: function (req, res) {
var data = req.body;
var date = new Date();
var username = req.user.username;
User.findOne({username:username}, function(err, user) {
if (err) return handleErr(err);
find = {
coordinates: [data.longitude, data.latitude],
datetime: date
};
user.location.push(find);
user.save();
});
},
scan: function (req, res) {
var date = new Date();
var twentyb4 = date.setMinutes(date.getMinutes - 15);
User.find({"datetime": {$gte: twentyb4}}, function (err, user) {
if (err) return handleErr(err);
for (var i = 0; i < user.length; i++) {
//return users other than current user
if(req.user.username !== user[i].username){
User.find({$and: [{username: user[i].username}, {$near: {$geometry: {type: "Point", coordinates: [ req.user.longitude, req.user.latiude ]}, $maxDistance: 300, $minDistance: 0}}]}, function(err, data){
if (err) return handleErr(err);
console.log(data.username);
});
}
}
});
};
所以扫描功能最终要做的就是找到数据库中不包括当前用户的所有用户。然后它会过滤以仅获取在过去 20 分钟内登录的用户。然后我再过滤一次,将其他用户的最后报告位置与当前用户的位置进行比较。
【问题讨论】:
标签: javascript node.js mongodb mongodb-query geospatial