每次用户连接到应用程序时,我使用 socket.io 来广播地理定位(lat、lng)并在地图上设置新的标记图标。如果日本的用户连接,socket.io 会将他的位置发送给我,他也会收到我的位置。问题是我不希望用户接收距离很远的用户的位置(并将我的位置发送给),但只能在预定义的半径内(例如:20 公里)。
mongo DB 中的空间搜索似乎适合识别位于同一区域的用户并将其分配给 groupId。相同 groupId 的用户将被分配一个他们将收听的公共 socket.io 频道。
为了实现我的梦想,我实际上是在尝试使用 mongoose 将用户信息推送到 Mongo DB 中。问题是猫鼬在服务器中运行,而数据在客户端。
我已经定义了一个 schema.js 来构建数据库,但是我对如何设置将客户端数据与 mongoose 链接的路由有点迷茫?我知道 mongoose 和客户端都必须返回适当的 JSON 对象才能进行通信,并且数据可以使用model.save()
. 很抱歉这个幼稚的问题,但在这一点上的帮助将不胜感激。谢谢你。
编辑 :
我终于使用 socket.io 将用户数据传递给具有send2DB
功能的服务器,但我遇到了这个错误:
Object { _id: 50fc08aebb97d3201d000001,
coords; [],
date: Sun Jan 20 2013 16:18:34 GMT+0100 (Paris, Madrid) } has no methode 'push'`
这似乎是数组的问题,coords
但我不明白为什么它也返回日期!这是代码:
应用程序.js:
// generate unique user id
var userId = Math.random().toString(16).substring(2,15);
// code here
onLocationfound = function(e){
userMarker.setLatLng(e.latlng);
map.setView(userMarker.getLatLng(),map.getZoom());
latitude = (e.latlng[0]||( Math.round(e.latlng.lat*1000)/1000));
longitude = (e.latlng[1]||( Math.round(e.latlng.lng*1000)/1000));
// send data to database (executed once)
sentData = {id: userId, coords: [{lat: latitude, lng: longitude}]}
socket.emit('send2DB', sentData);
服务器.js:
mongoose.connect('mongodb://localhost/test');
var mongoose = require('mongoose')
, Schema = mongoose.Schema
, ObjectId = Schema.ObjectId;
// create schema
var userInformation = new Schema({
username: { type: String, required: true, trim: true },
email: { type: String, required: true, trim: true },
role: { type: String, required: true, trim: true },
date: {type: Date, default: Date.now},
userId: String,
longitude: Number,
latitude: Number,
coords: [Number, Number]
});
// export retrieve my model
var MyModel = mongoose.model('ModelName', userInformation);
var instance = new MyModel();
// code here
io.sockets.on('connection', function (socket) {
// code here
// Store user data to DB then query spatial info //
socket.on('send2DB', function (data) {
console.log('Position is', data);
instance.push(
{userId: 'data.id'},
{latitude: 'data.lat'}
);
instance.save(function (err) {
if (!err) console.log('Success!')
else console.log('Error');
});
});