【问题标题】:Join two tables with selected fields and where clause in mongodb在 mongodb 中加入两个具有选定字段和 where 子句的表
【发布时间】:2018-11-04 15:00:52
【问题描述】:

我有两个收藏如下:-

table1

{"_id" : ObjectId("5b9a.."), "item_id" :"1.1", "m_date" : "20130401","ref_id":"12R","sub_item_id":"1.1.1"}
{"_id" : ObjectId("5c37.."), "item_id" :"1.1", "m_date" :  "20140401","ref_id":"12R","sub_item_id":"1.1.2"}
{"_id" : ObjectId("123cb.."), "item_id" :"1.2", "m_date" : "20140401","ref_id":"12R","sub_item_id":"1.1.3"}

table2

{"_id" : ObjectId("7cb3.."), "item_id" :"1.1", "m_date" : "20130401","ref_id":"12R","sub_item_id":"1.1.1"}
{"_id" : ObjectId("8f34.."), "item_id" :"1.1", "m_date" : "20140401","ref_id":"13R","sub_item_id":"1.1.2"}
{"_id" : ObjectId("5ec8b.."), "item_id" :"1.2", "m_date" : "20150401","ref_id":"14R","sub_item_id":"1.1.3"}

我想显示来自table1 :item_id, m_date, sub_item_idtable2 : ref_id 的字段,其中 item_id:1.1 这必须在两个表中。所以预期的结果应该是这样的:-

{"item_id" :"1.1", "m_date" : "20130401","sub_item_id":"1.1.1","ref_id":"12R"}
{"item_id" :"1.1", "m_date" : "20140401","sub_item_id":"1.1.2","ref_id":"13R"}

我尝试使用$lookup 编写以下查询,但找到了 0 个文档

db.table1.aggregate([

{$project:{
    item_id:1,
     m_date: 1, 
     sub_item_id : 1,
    ref_id :1
}},
{
    $lookup: {
        from: 'table2',
        localField: 'item_id',
        foreignField: 'item_id',
        as: 'table2_values'
     },
 },
{$unwind:'$table2_values'},

{ $group: { 
    _id: {ref_id: "$table2_values.ref_id", m_date:  "$m_date"
    ,sub_item_id:'$sub_item_id' },

}},    
{$project:{_id:0,m_date:'$_id.m_date',ref_id:'$_id.ref_id'
,sub_item_id:'$_id.sub_item_id',item_id:1}},
{
 $match: {"table2_values.item_id": "1.1"}
 }

])

请帮助我得到上述预期结果

【问题讨论】:

  • 我看不到 table2。两张表是否相同?
  • table1 的前 3 个文档,其余 3 个文档来自 table2。很少有字段值是相同的,但不是全部。这里 ref_id 不一样
  • 你用的是什么mongo版本?
  • @AnthonyWinzlet 3.4.7,升级没问题

标签: mongodb mongodb-query aggregation-framework lookup


【解决方案1】:

您可以尝试以下聚合与 mongodb 3.6

db.table1.aggregate([
  { "$match": { "item_id": "1.1" }},
  { "$lookup": {
    "from": "table2",
    "let": { "item_id": "$item_id", "m_date": "$m_date" },
    "pipeline": [
      { "$match": {
        "$expr": { "$eq": ["$$item_id", "$item_id" ] },
        "$expr": { "$eq": ["$$m_date", "$m_date"] }
      }}
    ],
    "as": "table2_values"
  }},
  { "$addFields": { "ref_id": { "$arrayElemAt": ["$table2_values.ref_id", 0] }}},
  { "$project": { "_id": 0, "item_id": 1, "ref_id": 1 }}
])

【讨论】:

  • 我想从两个表中获取字段数据,请查看预期输出
  • 我已经检查了输出,能否请您添加投影以显示几个特定字段
  • 我可以使用{"$project": { "_id":0,"item_id":"$item_id","ref_id":"$ref_id" }} 投射特定字段以显示。你能在上面的查询中添加一点解释吗?
  • 我已经更新了我的答案,你可以通过这个stackoverflow.com/questions/49953780/…获得解释
  • @SRK 如果它适合您,请接受答案。如果有任何问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
相关资源
最近更新 更多