我是mongoose的新手,仍在努力了解如何进行正确的查询
我有2个简单的模型
用户:
const UserSchema = new Schema({
name: String,
age: Number,
movies:[{
type: Schema.Types.ObjectId,
ref: 'movie'
}]
}, { collection: 'USER_COLLEC' });
电影:
const MovieSchema = new Schema({
title:String ,
duration: Number
}, { collection: 'MOVIE_COLLEC' });
我想要的是具有最长电影的用户(持续时间最长)
现在我明白了:
db.getCollection('USER_COLLEC') .
aggregate([
{ "$unwind": "$movies" } ,
{ $lookup:
{from: "MOVIE_COLLEC",
localField: "movies",
foreignField: "_id",
as: "movieContent"},
} ,
{ $unwind: "$movieContent" },
{ $group:
{ maxDuration: { $max: "$movieContent.duration" },
}
}
])
但它只能找到没有用户附加的最大持续时间...... 事实上,我只询问查询的最长持续时间,但在查找之后我失去了我的用户:(
我如何保留或检索用户数据?
如果你有任何想法,我完全陷入困境......
谢谢你们!
答案 0 :(得分:1)
您也可以使用$ push来获取电影对象。
db.getCollection('USER_COLLEC') .
aggregate([
{ "$unwind": "$movies" } ,
{ $lookup:
{from: "MOVIE_COLLEC",
localField: "movies",
foreignField: "_id",
as: "movieContent"},
} ,
{ $unwind: "$movieContent" },
{ $group:
{ _id: { $max: "$movieContent.duration" },
"movie": {
"$push": "movieContent"
}
}
}
])
在此之后,只需在用户的电影数组中搜索电影的_id
UserSchema.find({movies:{$in:movieContent[0]._id}});
或者,您也可以使用$push
$first
{ $first: "$movieContent" }
然后你不会在数组中得到它。
<强>更新强>
而不是{$push: $movieContent}
或{$first: $movieContent}
,你可以推$$ROOT
:
{$push: $$ROOT}
或{$first: $$ROOT}
然后你将获得整个对象。您不需要触发另一个查询来获取用户。
答案 1 :(得分:0)
我终于找到了解决方案,$ group不是解决方案
{
"_id" : ObjectId("59d2f64dded1c008192f7e73"),
"user" : "Michael",
"duration" : 96
}
这给了我类似的东西:
A