【发布时间】:2020-01-26 14:16:35
【问题描述】:
我有一个找不到解决方案的问题。
我有一个“中等”集合,其中包含一个深度嵌套的数组,其中通过 ObjectID 对人员集合的引用。
中等收藏:
{
"title": "Test Medium",
"mediumMetaData": {
"metaData": [{
"movietype": "movie",
"year": 2019,
"language": "german",
"personInformation": {
"actor": [{
"actors": "5e2c3b1daf0ba75b00415bb0"
}],
"director": [{
"directors": "5e2c3b1daf0ba75b00415bb0"
}],
"screenwriter": [{
"screenwriters": "5e2c3b1daf0ba75b00415bb0"
}],
"camera": [{
"cameras": "5e2c3b81af0ba75b00415bb1"
}]
}
}]
},
"createdById": "5dcb108b59057b22702ecaa9"
}
Person Collection 应通过“_id”字段匹配。
现在我的问题。我想通过引用 Person 中的所有 objectId 来构建聚合查询。
我现在尝试了几种方法,但查找根本不匹配:
这是我现在尝试的,但是 actor-tag 一直是空的: 前两个阶段正在工作,据我所知,我需要两个展开,每个数组部分一个。
db.getCollection("medium").aggregate(
[
{
"$match" : {
"_id" : ObjectId("5e2c3d9002d512c71cda8006")
}
},
{
"$unwind" : {
"path" : "$mediumMetaData.metaData",
"preserveNullAndEmptyArrays" : false
}
},
{
"$unwind" : {
"path" : "$mediumMetaData.metaData.personInformation.actor",
"preserveNullAndEmptyArrays" : false
}
},
{
"$lookup" : {
"from" : "person",
"let" : {
"actor_id" : "$mediumMetaData.metaData.personInformation.actor.actors"
},
"pipeline" : [
{
"$match" : {
"$expr" : [
{
"$eq" : [
"$_id",
"$$$actor_id"
]
}
]
}
},
{
"$project" : {
"_id" : 0.0
}
}
],
"as" : "actor1"
}
}
],
{
"allowDiskUse" : false
}
);
有人可以帮忙吗?
【问题讨论】:
-
这些是
"actors": "5e2c3b1daf0ba75b00415bb0"/"directors": "5e2c3b1daf0ba75b00415bb0"字符串还是ObjectId()的 -
另外,由于您将
$match作为ObjectId()的第一阶段,您可能不需要{ "allowDiskUse" : false },因为您对中等收集的操作将在一个文档上进行,尽管它需要扫描通过Person的所有索引键,无论如何请先尝试不使用它..
标签: mongodb mongodb-query aggregate