【发布时间】:2021-09-03 06:34:50
【问题描述】:
我有两个系列。一件艺术品,另一件收藏品(多件艺术品的专辑)。 每个艺术品都有一个“收藏”字段,该字段是一个数组,其中保存了它所属的收藏的 ID。
我想做的是获取用户的所有收藏以及每个收藏的前 4 幅作品(以在应用中显示预览)。
然而,这件事,我以为很简单,结果却变得更复杂了。
在普通查询中,我会这样做:
artworkModel.find({
collections: collection
})
但是,在聚合管道中,这不起作用,因此我实施的解决方案是:
[
{$match: {
author: author,
},
},
{
$lookup: {
from: 'artworks',
as: 'previews',
let: { collection: '$_id' },
pipeline: [
{
$match: {
collections: { $exists: true },
$expr: { $in: ['$$collection', '$collections'] },
},
},
{ $sort: { date: -1 } },
{ $limit: 4 },
{ $addFields: { id: '$_id' } },
],
},
}
]
问题是我不能接受这个解决方案,因为它不像上面的查询那样使用“集合”字段上的索引,因此对集合执行全面扫描。感谢您的帮助。
编辑:样本数据
艺术品:
[
{
"_id": { "$oid": "612fa9541121d06014e7d9bc" },
"collections": [
{ "$oid": "612fa9481121d06014e7d9b5" },
{ "$oid": "612fa9f6b2cc520a84e83dde" }
],
"author": { "$oid": "5fe8fe53ff8d9dc25c9e3277" },
"text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vestibulum dolor id justo condimentum ",
"type": "Text"
},
{
"_id": { "$oid": "60eec90e787a0b320c514446" },
"author": { "$oid": "5fe8fe53ff8d9dc25c9e3277" },
"type": "Image",
"asset": { "$oid": "60eec90e787a0b320c514441" },
"collections": [{ "$oid": "612fa9f6b2cc520a84e83dde" }]
},
{
"_id": { "$oid": "612fa9f2b2cc520a84e83db1" },
"collections": [{ "$oid": "612fa9f6b2cc520a84e83dde" }],
"author": { "$oid": "5fe8fe53ff8d9dc25c9e3277" },
"text": "Lorem ipsum dolor sit amet",
"type": "Text"
},
{
"_id": { "$oid": "612549d4778270001862472f" },
"author": { "$oid": "5fe8fe53ff8d9dc25c9e3277" },
"type": "Video",
"asset": { "$oid": "612549d4778270001862472a" }
}
]
收藏:
[
{
"_id": { "$oid": "612fa9f6b2cc520a84e83dde" },
"name": "Name",
"author": { "$oid": "5fe8fe53ff8d9dc25c9e3277" },
"itemsCount": 3,
}
]
【问题讨论】:
-
能否提供示例 json 数据?
-
@mohammad Naimi 感谢您的关注。我已经编辑了问题。
-
示例数据中没有日期字段,假设集合有 1 个您忘记添加的日期字段,我猜
-
是的,对不起,我没有意识到它在查询中被使用了。我已经简化了文档以提高可读性
标签: arrays mongodb mongoose aggregation-framework lookup