提问者:小点点

mongo两个集合之间的连接


我有两个mongo收藏:

>

  • defn

    "_id" : ObjectId("8570bebcb7db3"), 
    "fields" : [    {      
    "control" : {   "appearance" : "field-list" },  
    "children" : [ {       "bind" : {      "required" : "yes" },   ...
    

    数据

    "_id" : ObjectId("1570bf18a7db"),
    "defn" : ObjectId("8570bebcb7db3"),
    "data" : {
            "country" : "",
            "age" : 1,
            "age_unit" : "years", 
    },
    "label" : "type"
    

    _id=data. defn

    如何编写一个查询来返回Defn._id的data. label?该查询的格式为db.defn.find({data.label where defn._id="X"})


  • 共2个答案

    匿名用户

    如果您使用的是MongoDB 3.2,$lookup阶段可以执行相当于左向外连接的操作。

    留档在此提供了使用此操作的示例。

    使用您的数据的示例:

    db.defn.insert({
      "_id" : "123456", 
      "some_text" : "main document"
    })
    
    db.data.insert( { 
      "defn" : "123456",
      "label" : "data we want to access"
    })
    
    db.defn.aggregate( [ 
      { "$lookup" : {
         "from" : "data",
         "localField" : "_id", 
         "foreignField" : "defn",
         "as" : "defns"
        }
      } 
    ])
    
    // Results:
    // { 
    //   "_id" : "123456", 
    //   "some_text" : "main document", 
    //   "defns" : [ { 
    //      "_id" : ObjectId("57a2cbbbeb99ff285a1f0893"), 
    //      "defn" : "123456", 
    //      "label" : "data we want to access" 
    //    } ] 
    // }
    

    匿名用户

    你可能想试试这个模块@coolgk/mongo,它允许你加入和过滤多个集合。

    SELECT*from a LEFT JOIN b on a.b_id=b.id

    变得

    model.find({}, {
        join: [ { on: 'b_id' } ]
    })
    

    结果:

    [{
        _id: '5a8bde4ae2ead929f89f3c42',
        a_name: 'aname1',
        b_id: {
            _id: '5a8bde4ae2ead929f89f3c41',
            b_name: 'bname1'
        }
    }, { ... }, ... ]
    

    选择*from a, b WHERE a.b_id=b.id和b.b_name='bname1'

    变得

    model.find({}, {
        join: [ { on: 'b_id', filters: { b_name: 'bname1' } } ]
    })
    

    结果:

    [{
        _id: '5a8bdfb05d44ea2a08fa8a4c',
        a_name: 'aname2',
        b_id: {
            _id: '5a8bdfb05d44ea2a08fa8a4b',
            b_name: 'bname2'
        }
    }]
    

    SELECT*from a, b,c WHERE a.b_id=b.id和b.c_id=c.id和c.c_name='cname3'

    modela.find({}, {
        join: [{
            on: 'b_id',
            join: [{
                on: 'c_id',
                filters: { c_name: 'cname3' }
            }]
        }]
    })
    

    结果:

    [{
        _id: '5a8bdfc1b07af22a12cb1f0b',
        a_name: 'aname3',
        b_id: {
            _id: '5a8bdfc1b07af22a12cb1f0a',
            b_name: 'bname3',
            c_id: {
                _id: '5a8bdfc1b07af22a12cb1f09',
                c_name: 'cname3'
            }
        }
    }]