我正在尝试创建一个调用,将“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'}}}
])
您可以使用
$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 进行测试。