【问题标题】:How to aggregate using $lookup when foreignField value is not in localField当 foreignField 值不在 localField 中时如何使用 $lookup 进行聚合
【发布时间】:2020-02-20 09:38:20
【问题描述】:

我正在尝试使用 $lookup 来聚合来自 2 个集合的数据

当有localField 值不在外部字段中时,聚合结果仍然包含localField 值,并且应该与之匹配的数据为空。但是当有一个foreignField值不在localField中时,该行数据不在最终结果中。

就我而言,本地和外部字段是它们各自的键。 这里有一些图片来说明我的意思。

保存在 2 个集合中的值(已作为 JSON 传递到 mongoDB):picture of excel files

集合一个例子:

  /* 1 */
{
    "_id" : ObjectId("5dad17507c3ad142d46d212f"),
    "joina_key" : "key",
    "joina_value1" : "value 1",
    "joina_value2" : "value 2",
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("5dad17507c3ad142d46d2133"),
    "joina_key" : "D1",
    "joina_value1" : "4",
    "joina_value2" : "8",
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("5dad17507c3ad142d46d2131"),
    "joina_key" : "B1",
    "joina_value1" : "2",
    "joina_value2" : "4",
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("5dad17507c3ad142d46d2132"),
    "joina_key" : "C1",
    "joina_value1" : "3",
    "joina_value2" : "6",
    "__v" : 0
}

/* 5 */
{
    "_id" : ObjectId("5dad17507c3ad142d46d2130"),
    "joina_key" : "A1",
    "joina_value1" : "1",
    "joina_value2" : "2",
    "__v" : 0
}

集合 B 示例:

  /* 1 */
{
    "_id" : ObjectId("5dad17d532987d08a8e3e009"),
    "joinb_key" : "key",
    "joinb_mult1" : "multiple 1",
    "joinb_mult2" : "multiple 2",
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("5dad17d532987d08a8e3e00a"),
    "joinb_key" : "A1",
    "joinb_mult1" : "10",
    "joinb_mult2" : "20",
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("5dad17d532987d08a8e3e00b"),
    "joinb_key" : "B1",
    "joinb_mult1" : "10",
    "joinb_mult2" : "20",
    "__v" : 0
}

/* 4 */
{
    "_id" : ObjectId("5dad17d532987d08a8e3e00c"),
    "joinb_key" : "C1",
    "joinb_mult1" : "10",
    "joinb_mult2" : "20",
    "__v" : 0
}

/* 5 */
{
    "_id" : ObjectId("5dad17d532987d08a8e3e00d"),
    "joinb_key" : "D2",
    "joinb_mult1" : "10",
    "joinb_mult2" : "20",
    "__v" : 0
}

我拥有的输出和我想要实现的输出:picture of outputs

我想知道是否有人知道如何实现这一点。

我对此很陌生,如果我遗漏了什么,请告诉我。提前致谢。

【问题讨论】:

    标签: reactjs mongodb mongoose


    【解决方案1】:

    试试这个查询

    db.tester.aggregate([
        {$lookup: {
            from: 'demo',
            pipeline: [
                { $sort: { joinb_key: 1}},
            ],
            as: 'pointValue',
        }},
        { "$addFields": {
            "pointValue": 
              {
                  "$filter": {
                          "input": "$pointValue",
                          "as": "sn",
                          "cond": {
                            "$and": [
                              { "$eq": [ "$$sn.joinb_key", "$joina_key" ] },
                         ]
                  }
              }
           } 
    
        }},
       {
          $replaceRoot: { newRoot: { $mergeObjects: [ { $arrayElemAt: [ "$pointValue", 0 ] }, "$$ROOT" ] } }
        },
        { $project: { joina_key :1,joina_value1:1, joina_value2:1, joinb_mult1:1,joinb_mult2:1,m1_v1: { $multiply: [ "$joinb_mult1", "$joina_value1" ] },m2_v2: { $multiply: [ "$joinb_mult2", "$joina_value2" ] } } }
    
    ])
    

    【讨论】:

    • 如果有问题请再次检查查询告诉我
    • 我不确定'key'是指a_key还是b_key
    • 它只返回 _id 、 m1_v1 和 m2_v2。缺少 v1、v2、m1、m2。 m1_v1 和 m2_v2 的值也为空
    • 请分享集合 a 和 b,你想收藏什么?由 json 编辑器分享 (jsoneditoronline.org)
    • mult_1、mult_2 丢失。 m1_v1 和 m2_v2 仍然为空。并且集合 B 中的 D2 对象没有出现
    猜你喜欢
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 2018-12-12
    • 2023-02-12
    相关资源
    最近更新 更多