“加入" MongoDB中使用节点js的两个集合 [英] "Join" two collection in MongoDB using node js
问题描述
我正在尝试使用节点js在mongodb中的两个集合之间进行查询.
I'm trying to make a query between two collections in mongodb using node js.
我在数据库中有这两个集合:
I have these two collection in the db:
旅行
{
"_id":ObjectId("55a922531e35772c1b17d4a0"),
"name":"trip_name",
"waypoints":[
"4c828999d8086dcb03877752",
"4dd2ae657d8b4c6585f1a6fd",
"4c59c3e4f346c928a8634dca"
],
"line_points":[
[
42.850937,
13.569256
],
[
42.85109,
13.569377
],
[
42.851131,
13.569225
]
],
"time":"00:10:23",
"distance":6.622,
"hashKey":"object:8207"
};
兴趣点
{
"_id":"4c828999d8086dcb03877752",
"type":"Feature",
"geometry":{
"type":"Point",
"coordinates":[
13.575249910354614,
42.85484995890166
]
},
"properties":{
"title":"Lorenz Cafè",
"id":"4c828999d8086dcb03877752",
"poi-type":1,
"category":"ristorazione",
"subCategory":"Café",
"categoryIds":"4bf58dd8d48988d16d941735",
"marker-color":"#FF7519",
"marker-size":"small",
"marker-symbol":"restaurant",
"indirizzo":"Piazza del Popolo, 5",
"citta":"Ascoli Piceno",
"regione":"Marche"
}
通过这条路线,我会根据该步骤的ID进行查询,我希望该查询可以像这样恢复json:
Through the route, I do I query according to the id that step and I would like that the query I would restore a json like this:
我想要的结果
{"_id":"55a922531e35772c1b17d4a0","name":"trip_name","waypoints":[{"4c828999d8086dcb03877752":{"title":"Lorenz Cafè","id":"4c828999d8086dcb03877752","category":"ristorazione","position":{"lat":42.85484995890166,"lng":13.575249910354614}}},{"4dd2ae657d8b4c6585f1a6fd":{"title":"Ottica Di Ferdinando","id":"4dd2ae657d8b4c6585f1a6fd","category":"negozi","position":{"lat":42.85485741498569,"lng":13.57675423240643}}},{"4c59c3e4f346c928a8634dca":{"title":"Leopoldus Ristorante","id":"4c59c3e4f346c928a8634dca","category":"ristorazione","position":{"lat":42.85648980743132,"lng":13.575512766838072}}}],"line_points":[[42.850937,13.569256],[42.85109,13.569377],[42.851131,13.569225]],"time":"00:10:23","distance":6.622}
我实现了这条路线:
/*
TRIP BY ID
*/
var j=0;
router.get('/:id', function(req, res) {
db = req.db;
var idString=req.params.id;
var objId = new ObjectID(idString);
var collection2=db.get('poilist');
var collection = db.get('trip');
collection.find({"_id": objId},{},function(e,docs){
var trip=docs[0];
var poi=[];
var wp=trip.waypoints;
for(var i=0; i< wp.length; i++)
{
collection2.find({"properties.id": wp[i]},function(e,docs2){
poi[j]={
"title" : docs2[0].properties.title,
"id": docs2[0].properties.id,
"category": docs2[0].properties.category,
"position": {"lat":docs2[0].geometry.coordinates[1], "lng":docs2[0].geometry.coordinates[0]}
};
var id = wp[j];
wp[j]= {};
wp[j][id]=poi[j];
if(j==wp.length-1){
console.log('emit '+j);
emitter.emit('attesa' + j);
}else{
j++;
}
});
}
emitter.once('attesa'+ (trip.waypoints.length-1) ,function() {
j=0;
console.log('once');
res.json(trip);
});
});
});
此路由有效,但是如果您同时拨打多个电话,则不再有效.
This route works but if you were to make multiple calls simultaneously, no longer work.
我有个主意:计算请求的数量,然后仔细检查该地点的ID是否在这次旅行中,但这似乎非常昂贵. 我想知道一种用于在mongo中对多个集合进行查询的更实用的方法. 预先感谢
I have an idea: count the number of requests and go to double check if the id of the place is in this trip but it seems very expensive. I would like to know a more practical method for making queries with multiple collections in mongo. Thanks in advance
推荐答案
首先,我建议您使用猫鼬.首先,您必须准备模型,例如:
first i recommend you use mongoose. Before all you must prepare your Models, for example:
var mongoose = require('mongoose')
, Schema = mongoose.Schema
var personSchema = Schema({
_id : Number,
name : String,
age : Number,
stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var storySchema = Schema({
_creator : { type: Number, ref: 'Person' },
title : String,
fans : [{ type: Number, ref: 'Person' }]
});
var Story = mongoose.model('Story', storySchema);
var Person = mongoose.model('Person', personSchema);
在此之后,当您想要加入"时,最常使用下一种方法:
and after this when you want "join" you most use next method:
Story.find().populate("fans");
要磨牙 http://mongoosejs.com/docs/populate.html
这篇关于“加入" MongoDB中使用节点js的两个集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!