代码之家  ›  专栏  ›  技术社区  ›  DanielWoodward

MongoDB$查找值返回数组

  •  2
  • DanielWoodward  · 技术社区  · 8 年前

    我有一个包含多个项目的文档,需要从另一个集合中查找更多信息以填写数据。

    主要文件:

    {
      _id: ObjectID("5a30ff41af58f911946b122e"),
      SalesItems: [
        {
          SalesItemID: 1139,
          Quantity: 2,
          Amount: 3.00
        },
        {
          SalesItemID: 2549,
          Quantity: 1,
          Amount: 5.40
        }
      ]
    }
    

    然后是另一个名为SalesItem的集合,其中包含这些销售项目的详细信息。两份文件

    {
      _id: 1139,
      Name: "Item #1",
      Price: 1.50
    }
    {
      _id: 2549,
      Name: "Item #2",
      Price: 5.40
    }
    

    我正在尝试在聚合中执行$查找,以将SalesItem集合中的信息拉入我的主集合的SalesItems数组。要获得如下结果:

    {
      _id: ObjectID("5a30ff41af58f911946b122e"),
      SalesItems: [
        {
          SalesItemID: 1139,
          Quantity: 2,
          Amount: 3.00,
          SalesItemInfo: {
            _id: 1139,
            Name: "Item #1",
            Price: 1.50
          }
        },
        {
          SalesItemID: 2549,
          Quantity: 1,
          Amount: 5.40,
          SalesItemInfo: {
            _id: 2549,
            Name: "Item #2",
            Price: 5.40
          }
        }
      ]
    }
    

    有人能告诉我这是否可行吗?

    我尝试了以下操作,但结果是结果中的SalesItems对象中只存在SalesItemInfo。

    aggregate([
        {
            $lookup: {
                from: "SalesItem",
                localField: "SalesItems.SalesItemID",
                foreignField: "_id",
                as: "SalesItems.SalesItemInfo"
            }
        }
    ])
    

    在本例中,SalesItem集合已被大量简化,在插入Mongo之前,它实际上是一个990行的JSON文档。在主表中,它将被复制大约64000次,因此我试图避免将信息嵌入到主文档中。

    在此方面的任何帮助都将不胜感激。

    谢谢,丹尼尔。

    1 回复  |  直到 8 年前
        1
  •  0
  •   DanielWoodward    8 年前

    在经过不同阶段的摸索后,终于找到了答案:

    aggregate([
    {
      $unwind: "$SalesItems"  
    },
    {
        $lookup: {
            from: "SalesItem",
            localField: "SalesItems.SalesItemID",
            foreignField: "ID",
            as: "SalesItemDetails"
        }
    },
    {
        $group: {
            _id: "$_id",
            SalesItems: {
                $push: {
                    SalesItemID: "$SalesItems.SalesItemID",
                    SalesItemDetails: "$SalesItemDetails"
                }
            }
        }
    }
    ])
    

    这正是我想要的结果。

    推荐文章