我有两个系列, 一是项目征集 其他是批量采集
两个集合看起来像这样
集合“项目”:
{
"_id" : ObjectId("6102780c27474af56cf6734b"),
"channel" : "instagram",
"status" : "new",
"analysis_type" : "detail",
"batch_ids" : [
"6102780c27474af56cf6734d",
"6102780d27474af56cf6734f",
"6102780d27474af56cf67351",
"6102780e27474af56cf67353",
"6102780e27474af56cf67355",
"6102780e27474af56cf67357"
]
}
集合“批次”:
"_id" : ObjectId("6102780c27474af56cf6734d"),
"keyword" : {
"keyword" : "tomato",
"keyword_type" : "hashtag"
},
"channel" : "instagram",
"post_datetime" : ISODate("2021-07-29T18:42:36.306Z"),
"analysis_type" : "detail",
"status" : "new",
}
一个项目包含多个批次。因此,在名为 batch_ids 的字段中,我写下了项目包含的批次。 batch_ids 字段的每个元素都是批处理集合的 _id 字段的值。我想立即查看属于一个项目的批次的状态。 如何创建视图?我想看到的结果是:
{
"_id" : ObjectId("6102780c27474af56cf6734b"),
"channel" : "instagram",
"status" : "new",
"analysis_type" : "detail",
"batch_ids" : [
{
"_id":ObjectId("6102780c27474af56cf6734d"),
"status":"new"
},
{
"_id":ObjectId("6102780d27474af56cf6734f"),
"status":"new"
},
{
"_id":ObjectId("6102780d27474af56cf67351"),
"status":"new"
},
{
"_id":ObjectId("6102780e27474af56cf67353"),
"status":"new"
},
{
"_id":ObjectId("6102780e27474af56cf67355"),
"status":"new"
},
{
"_id":ObjectId("6102780e27474af56cf67357"),
"status":"new"
},
]
}
答案 0 :(得分:1)
一个简单的 $lookup
就足够了:
db.project.aggregate([
{
"$lookup": {
"from": "batch",
"let": {
batchObjectIds: {
$map: {
input: "$batch_ids",
as: "batch_id",
in: {
"$toObjectId": "$$batch_id"
}
}
}
},
"pipeline": [
{
$match: {
$expr: {
$in: [
"$_id",
"$$batchObjectIds"
]
}
}
},
{
$project: {
_id: 1,
status: 1
}
}
],
"as": "batch_ids"
}
}
])
*请注意,因为您将 batch_ids
保存为 string
而不是 objectId
,所以我们必须使用 toObjectId 将它们转换为 ObjectId
,这意味着这可以仅适用于 Mongo v4.0+。如果您使用的是较小的 Mongo 版本,则必须将其拆分为 2 个调用。