私はsocket.ioを使用してジオロケーション(lat、lng)をブロードキャストし、ユーザーがアプリに接続するたびに地図上に新しいマーカーアイコンを設定します。日本のユーザーが接続すると、socket.ioから自分のポジションが送信され、私のポジションも受信されます。問題は、ユーザーが遠くにいるユーザーの位置を受信したくない(そして自分の位置を送信したくない)が、事前定義された半径(例:20 km)内にあることです。
mongo DB内の空間検索は、同じエリアにいるユーザーを識別し、それらをgroupIdに割り当てるのに適切なようです。同じgroupIdのユーザーには、リッスンする共通のsocket.ioチャネルが割り当てられます。
私の夢を実現するために、私は実際にユーザー情報をmongooseを使用してMongoDBにプッシュしようとしています。問題は、データがクライアントにあるときにマングースがサーバーで実行されることです。
データベースを構造化するためにschema.jsを定義しましたが、クライアントデータをマングースとリンクするルートを設定する方法に少し迷っていますか?私は、マングースとクライアントの両方が通信するために適切な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
なぜ日付が返されるのかわかりません。コードは次のとおりです。
application.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);
server.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');
});
});