代码之家  ›  专栏  ›  技术社区  ›  Johan Rin

使用$lookup“填充”字段,而不覆盖现有值

  •  1
  • Johan Rin  · 技术社区  · 6 年前

    考虑以下文件:

    communications 文件

    {
        "_id" : ObjectId("5c069a6acbd69e0f61983850"),
        "type" : "request",
        "title" : "test 1",
        "messages" : [ 
            {
                "authorId" : "7b0dcd22-c3bb-426f-8235-671b82acee98",
                "body" : "test 1",
                "createdAt" : ISODate("2018-12-04T15:16:58.342Z")
            }
        ],
        "receivers" : [ 
            "e75f3849-09bb-46a4-a05d-885b6d31ccc3"
        ]
    }
    

    users 文件

    {
        "_id" : "7b0dcd22-c3bb-426f-8235-671b82acee98",
        "userInfo" : {
            "avatarKey" : "7b0dcd22-c3bb-426f-8235-671b82acee98/avatars/Dandelion.png",
            "familyName" : "Doe",
            "givenName" : "John"
        }
    }
    

    蒙古人壳 ,我试图找回 通信 messages.authorId “填充”为 userInfo 我的田野 user 文件。

    我试着用 $lookup 这样地:

    db.communications.aggregate([
       {
         $lookup:
           {
             from: "users",
             localField: "messages.authorId",
             foreignField: "_id",
             as: "messages.authorId"
           }
      }
    ])
    

    但田地 消息.authorid 被覆盖。

    如何“填充”我的 用户信息 字段而不替换现有值?

    谢谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ashh    6 年前

    因为你 messages 是一个数组字段,当您提供 .dot 符号表示法 as ( "messages.authorId" )表达式。

    所以如果你想填充里面的每个用户 信息 你需要的阵列 $unwind 这个 信息 首先数组以添加新键,然后 $group 再滚回阵列。

    db.communications.aggregate([
      { "$unwind": "$messages" },
      { "$lookup": {
        "from": "users",
        "localField": "messages.authorId",
        "foreignField": "_id",
        "as": "messages.authorId"
      }},
      { "$unwind": "$messages.authorId" },
      { "$group": {
        "_id": "$_id",
        "messages": { "$push": "$messages" },
        "type": { "$first": "$type" },
        "title": { "$first": "$title" },
        "receivers": { "$first": "$receivers" }
      }}
    ])