【问题标题】:"Join" two collection in MongoDB using node js使用节点 js 在 MongoDB 中“加入”两个集合
【发布时间】:2015-10-07 10:14:17
【问题描述】:

我正在尝试使用节点 js 在 mongodb 中的两个集合之间进行查询。

我在数据库中有这两个集合:

旅行

{               
    "_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"
};

Poi

{  
      "_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:

我想要的结果

{"_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);
        });
    });
});

此路线有效,但如果您要同时拨打多个电话,则不再有效。

我有一个想法:数一数请求的数量,然后仔细检查该地点的 id 是否在此行程中,但似乎非常昂贵。 我想知道在 mongo 中使用多个集合进行查询的更实用的方法。 提前致谢

【问题讨论】:

    标签: node.js mongodb express mongodb-query


    【解决方案1】:

    首先我建议你使用猫鼬。首先,您必须准备好模型,例如:

    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);
    

    在此之后,当您想要“加入”时,您最常使用下一个方法:

    Story.find().populate("fans");
    

    为摩尔http://mongoosejs.com/docs/populate.html

    【讨论】:

    • 请问,由于我不太了解mongoose,与我使用的库相比,它有什么优势?
    • Mongoose 使您能够为数据库提供结构(模式)并运行更高级的查询。查看mongoosejs.com/docs/guide.html 获取更多帮助
    • 我们可以根据person.name 过滤Story.find().populate("fans"); 就像在sql select * from a JOIN b on a.a = b.b where b.some like "%filtertext%" 中一样
    【解决方案2】:

    只需在第一次请求时获取基本 JSON 数据

    { "_id":ObjectId("55a922531e35772c1b17d4a0"), "name":"trip_name", “航路点”:[ "4c828999d8086dcb03877752", “4dd2ae657d8b4c6585f1a6fd”, “4c59c3e4f346c928a8634dca” ] }

    然后调用其他 API,该 API 使用异步调用和 Promise 获取航点数据,一旦 Promise 得到解决,就合并它们。

    【讨论】:

    • 我不明白你在说什么,对不起
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    • 2019-10-21
    • 2019-08-03
    • 2012-09-15
    • 2020-05-12
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多