如何在MongoDB聚合中提取数组元素的字段?

时间:2021-05-15 20:16:49

标签: arrays mongodb mongoose mongodb-query aggregation-framework

所以,我的文档就像下面的例子。

{
    image: {imageUrl: "http://imageurlsite.com/xyz"},
    additionalImages: [
        {imageUrl: "http://imageurlsite.com/pdq"},
        {imageUrl: "http://imageurlsite.com/lol"},
        {imageUrl: "http://imageurlsite.com/zomg"}
    ]
}

使用 MongoDB 聚合管道,如何从 imageadditionalImages 创建新的数组字段,包括 imageUrl 部分?我想要这样的新字段:

[
    "http://imageurlsite.com/xyz", 
    "http://imageurlsite.com/pdq",
    "http://imageurlsite.com/lol",
    "http://imageurlsite.com/zomg"
]

我尝试在 $group 阶段使用以下内容,这部分有效,但我只想要字符串值。

{
  image: {$addToSet: "$image"},
  additionalImages: {$addToSet: "$additionalImages"}
}

不幸的是,上面的结果给了我这个;

[
    {imageUrl: "http://imageurlsite.com/xyz"}, 
    {imageUrl: "http://imageurlsite.com/pdq"},
    {imageUrl: "http://imageurlsite.com/lol"},
    {imageUrl: "http://imageurlsite.com/zomg"}
]

1 个答案:

答案 0 :(得分:2)

演示 - https://mongoplayground.net/p/KOSCPLetrZO

db.collection.aggregate([
  {
    $group: {
      _id: null,
      image: { $addToSet: "$image.imageUrl" }, // take imageUrl 
      additionalImages: { $addToSet: "$additionalImages.imageUrl" } // take imageUrl
    }
  },
  {
    $set: {
      images: {
        "$concatArrays": [ // combine both arrays
          { "$first": "$additionalImages" },
          "$image"
        ]
      }
    }
  },
  {
    "$project": { images: 1 } // project only images
  }
])

输出 -

[
  {
    "_id": null,
    "images": [
      "http://imageurlsite.com/pdq",
      "http://imageurlsite.com/lol",
      "http://imageurlsite.com/zomg",
      "http://imageurlsite.com/xyz"
    ]
  }
]