将单个 mongo 文档中的数组与聚合组合

问题描述 投票:0回答:1

我正在尝试创建一个调用,将“images”和“posts.images”之间的所有图像组合起来,并按createdAt排序。到目前为止我已经:

output = [Array(1), Array(3), {…}, {…}, {…}, {…}, {…}, {…}]

因此,它似乎是将数组合并到父数组中,而不是合并到单个数组中。

我想要什么:

output = [{…},{…},{…},{…},{…},{…},{…},{…},{…},{…},{…},{…}]

这是我的架构:

const deviceSchema = new Schema({
owner: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User',
},
images: [{
    url: {
        type: String,
    },
    createdAt: {
        type: Date,
    }
}],
posts: [{
    description: {
        type: String,
    },
    images: [{
        url: {
            type: String,
        },
        createdAt: {
            type: Date,
        }
    }],
    createdAt: {
        type: Date,
    }
}],
});

这是我的汇总调用:

const images = await Device.aggregate([
        { $project: {
            combinedImages: { $concatArrays: ["$images", "$posts.images"] }
        }},
        { $match: { _id: id }},
        { $unwind: '$combinedImages' },
        { $sort: { 'combinedImages.createdAt': -1 }},
        { $skip: (page-1)*limit },
        { $limit: limit },
        { $group: { _id: '$_id', images: { $push: '$combinedImages'}}}
    ])
mongodb mongoose aggregate
1个回答
0
投票

您可以使用

$concatArrays
$reduce
的组合将所有图像组合成一个数组,例如:

db.collection.aggregate([
  {
    $set: {
      combinedImages: {
        "$concatArrays": [
          "$images",
          {
            $reduce: {
              input: "$posts",
              initialValue: [],
              in: {
                "$concatArrays": [
                  "$$value",
                  "$$this.images"
                ]
              }
            }
          }
        ]
      }
    }
  }
])

这会产生以下输出:

{
    // ...
    "combinedImages": [
      {
        "url": "img1"
      },
      {
        "url": "img2"
      },
      {
        "url": "post_img11"
      },
      {
        "url": "post_img12"
      },
      {
        "url": "post_img21"
      },
      {
        "url": "post_img22"
      }
    ],
    // ...
}

请参阅此 mongoplayground 进行测试。

© www.soinside.com 2019 - 2024. All rights reserved.