我有一个问题,我找不到解决方法。
我有一个集合“ medium”,其中包含一个非常需要的数组,其中通过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"
}
人员收藏应通过“ _id ”字段进行匹配。
现在是我的问题。我想通过引用Person中的所有objectIds来构建聚合查询。
我现在尝试了几种方法,但是查找根本不匹配:
这是我现在尝试的方法,但是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
}
);
有人可以帮忙吗?
答案 0 :(得分:0)
尝试此查询:
db.medium.aggregate([{ $match: { "_id": ObjectId("5e2df451d02e05b69467d1bc") } },
{ $unwind: '$mediumMetaData.metaData' },
{
$lookup:
{
from: "Person",
let: {
actor: "$mediumMetaData.metaData.personInformation.actor", director: "$mediumMetaData.metaData.personInformation.director",
screenwriter: "$mediumMetaData.metaData.personInformation.screenwriter", camera: "$mediumMetaData.metaData.personInformation.camera"
},
pipeline: [
{
$project: {
name: 1,
personID: {
$let:
{
vars: { id: '$_id' },
in: { $toString: "$$id" }
}
}
}
},
{
$match:
{
$expr:
{
$or:
[
{ $in: ['$personID', "$$actor.actors"] },
{ $in: ['$personID', "$$director.directors"] },
{ $in: ['$personID', "$$screenwriter.screenwriters"] },
{ $in: ['$personID', "$$camera.cameras"] }
]
}
}
}, { $project: { personID: 0 } }
],
as: "personInfo"
}
}, { $unwind: { path: "$personInfo", preserveNullAndEmptyArrays: true } },
{ $group: { _id: '$_id', 'metaData': { $addToSet: '$mediumMetaData.metaData' },
personInfo: { $push: '$personInfo' }, title: { $first: '$title' }, createdById: { $first: '$createdById' } } },
{ $project: { 'mediumMetaData.metaData': '$metaData', createdById: 1, title: 1, personInfo: 1 } }
])
注意::如果您的"actors": "5e2c3b1daf0ba75b00415bb0"/"directors": "5e2c3b1daf0ba75b00415bb0"
是ObjectId()
而不是strings
,则可以在{{1 }},只需比较类似$project