2016-08-03 91 views
1

我有兩個蒙戈集合之間的連接:蒙戈兩個集合

  1. DEFN

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

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

,其被連接在那裏defn._id =數據.defn

如何編寫一個查詢以返回defn._id的data.label? 該查詢將是形式 db.defn.find的({data.label其中defn._id =「X」})

+2

的可能的複製[?我如何執行SQL加入MongoDB中相當於(http://stackoverflow.com/questions/2350495/how-do-i-perform-the -SQL-加入等效功能於MongoDB中) – Philipp

回答

1

如果您使用的MongoDB 3.2中,$lookup階段可以執行的等效左外連接。

本文檔提供了使用此操作的示例here

示例使用您的數據:

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" 
// } ] 
// } 
0

你可能想試試這個模塊@coolgk/mongo,它可以讓你的加入,對多個集合進行篩選。

例子

SQL來蒙戈加入

左連接

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' 
    } 
}, { ... }, ... ] 
內加入與約束

SELECT * FROM a, b WHERE a.b_id = b.id AND 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 AND b.c_id = c.id AND 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' 
     } 
    } 
}]