2016-08-03 137 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' 
     } 
    } 
}]