聚合3个MongoDB集合-(Python、Flask、Jinja)
多亏了这里提供的巨大帮助,我在MongoDB中为2个集合建立了一些聚合聚合3个MongoDB集合-(Python、Flask、Jinja),python,mongodb,pymongo,Python,Mongodb,Pymongo,多亏了这里提供的巨大帮助,我在MongoDB中为2个集合建立了一些聚合 @app.route("/perfume/<id>", methods=["POST", "GET"]) def perfume(id): perfume = mongo.db.perfumes.find_one({"_id": ObjectId(id)}) form = AddReviewForm() cur = mongo.db.perfumes.aggregate(
@app.route("/perfume/<id>", methods=["POST", "GET"])
def perfume(id):
perfume = mongo.db.perfumes.find_one({"_id": ObjectId(id)})
form = AddReviewForm()
cur = mongo.db.perfumes.aggregate(
[
{
"$lookup": {
"from": "users",
"localField": "author",
"foreignField": "username",
"as": "creator",
}
},
{"$unwind": "$creator"},
{
"$project": {
"_id": "$_id",
"perfumeName": "$name",
"perfumeBrand": "$brand",
"perfumeDescription": "$description",
"date_updated": "$date_updated",
"perfumePicture": "$picture",
"isPublic": "$public",
"perfumeType": "$perfume_type",
"username": "$creator.username",
"firstName": "$creator.first_name",
"lastName": "$creator.last_name",
"profilePicture": "$creator.avatar",
}
},
{"$match": {"_id": ObjectId(id)}},
]
)
return render_template(
"perfume.html", title="Perfumes", cursor=cur, perfume=perfume, form=form
)
谢谢大家!
更新:
这是香水
[
{
"_id": {
"$oid": "5ebd751e0a52cd0dade39491"
},
"author": "Guillermo",
"brand": "A new Brand",
"name": "A new Perfume",
"perfume_type": "Oriental",
"description": "<p>This is the description</p>",
"date_updated": {
"$date": "2020-05-14T16:43:10.801Z"
},
"public": false,
"picture": "generic.png",
"review": [
{
"$oid": "5ebd752c0a52cd0dade39492"
}
]
}
]
这是评论
中的示例文档:
[
{
"_id": {
"$oid": "5ebd752c0a52cd0dade39492"
},
"review_author": "Guillermo",
"review": "<p>This is one review</p>"
}
]
[
{
“_id”:{
$oid:“5ebd752c0a52cd0dade39492”
},
“评论作者”:“Guillermo”,
“回顾”:“这是一次回顾”
}
]
因此,一个用户可以创建许多香水。香水可以有很多评论。
不同的用户可以为相同或不同的香水创建评论
更新2:
这看起来很有希望,我对此非常兴奋!
我将在模板中简要说明我的目标:
{% for item in cursor &}
<perfume name>
<perfume brand>
<perfume description>
<perfume picture>
<author username (of the perfume)>
<author first and last names>
<date created>
<eventually other information>
{% if current_user == author %}
<button edit>
<button delete>
{% endif %}
<button review <=+ available to all logged in users>
{% endfor %}
{% for item in cursor['review'] <= this is not working %}
<perfume review>
<perfume review author>
<perfume review author avatar>
<eventually other information>
{% endfor %}
{%用于游标中的项&}
{%如果当前用户==作者%}
{%endif%}
请尝试以下代码:
cur=db.perfumes.aggregate([
{
“$lookup”:{
'发件人':'用户',
'localField':'author',
“foreignField”:“用户名”,
“作为”:“创建者”
}
},
{
“$REWIND”:“$creator”
},
{
“$REWIND”:{
“路径”:“$review”,
“preserveNullAndEmptyArrays”:真
}
},
{
“$lookup”:{
“from”:“review”,
'let':{'rid':{'$toString':'$review.\u id'},
“管道”:[{
“$match”:{
“$expr”:{
'$eq':['$$rid',{'$toString':'$\U id'}]
}
}
}],
'as':'userReviews'
}
},
{
“$unwind”:“$userReviews”
},
{
“$lookup”:{
'发件人':'用户',
“localField”:“userReviews.review\u author”,
“foreignField”:“用户名”,
“as”:“reviewUserInfo”
}
},
{
“$REWIND”:“$reviewUserInfo”
},
{
“$group”:{
“\u id”:“$\u id”,
'香水名':{'$first':'$name'},
'香水品牌':{'$first':'$brand'},
'香水描述':{'$first':'$description'},
'date_updated':{'$first':'$date_updated'},
'香水图片':{'$first':'$picture'},
'isPublic':{'$first':'$public'},
'香水类型':{'$first':'$VAMERSE\U type'},
'username':{'$first':'$creator.username'},
'firstName':{'$first':'$creator.first_name'},
'lastName':{'$first':'$creator.last_name'},
'profilePicture':{'$first':'$creator.avatar'},
“用户评论”:{
“$push”:{
“reviewId”:“$userReviews.\u id”,
“review_author”:“$userReviews.review_author”,
“审阅”:“$userReviews.review”,
“审阅作者姓名”:“$reviewUserInfo.first\u name”,
“审阅作者姓氏”:“$reviewUserInfo.last\u name”,
“审阅作者电子邮件”:“$reviewUserInfo.email”,
“评论作者头像”:“$reviewUserInfo.avatar”
}
}
}
},
])
输出:
{
"_id" : ObjectId("5ebd7eec93256dc00c8f6f6c"),
"perfumeName" : "A new Perfume",
"perfumeBrand" : "A new Brand",
"perfumeDescription" : "<p>This is the description</p>",
"date_updated" : {
"$date" : "2020-05-14T16:43:10.801Z"
},
"perfumePicture" : "generic.png",
"isPublic" : false,
"perfumeType" : "Oriental",
"username" : "Guillermo",
"firstName" : "Guillermo",
"lastName" : "Brachetta",
"profilePicture" : null,
"userReviews" : [
{
"reviewId" : ObjectId("5ebd752c0a52cd0dade39492"),
"review_author" : "Guillermo",
"review" : "<p>This is one review</p>",
"review_author_first_name" : "Guillermo",
"review_author_last_name" : "Brachetta",
"review_author_email" : "brachetta@me.com",
"review_author_avatar" : "a92de23ae01cdfde.jpg"
}
]
}
{
“_id”:ObjectId(“5ebd7eec93256dc00c8f6f6c”),
“香水名”:“新香水”,
“香水品牌”:“新品牌”,
“香水描述”:“这是描述”,
“更新日期”:{
$date:“2020-05-14T16:43:10.801Z”
},
“香水图片”:“generic.png”,
“isPublic”:错误,
“香水类型”:“东方”,
“用户名”:“Guillermo”,
“firstName”:“Guillermo”,
“姓氏”:“布兰切塔”,
“profilePicture”:空,
“用户评论”:[
{
“reviewId”:ObjectId(“5ebd752c0a52cd0dade39492”),
“评论作者”:“Guillermo”,
“回顾”:“这是一次回顾”,
“评论作者姓名”:“Guillermo”,
“评论作者姓氏”:“Brachetta”,
“审阅作者电子邮件”:brachetta@me.com",
“评论作者头像”:“a92de23ae01cdfde.jpg”
}
]
}
p.S.-您可以使用$match
操作符匹配特定用户,就像您在OP中所做的那样,您可以使用$project
操作符投影更多字段并获得所需的输出 你能提供一些相关的样本文档吗?完成,期待!!非常感谢。我认为users
集合中的username
应该是'Guillermo'。review\u作者可以不是香水的创建者吗?是的,我选错了用户。我现在更新了。对此我很抱歉。是的,任何用户都可以查看香水,不一定是作者。香水可以有很多评论(由一个或不同的用户)。哇,我从来没有想到过这么复杂的东西!太神了让我看看如何实现它,因为它不是开箱即用的。使用它“原样”循环浏览光标,我得到的香水作者数量和评论数量一样多。也许我没有很好地使用我的模板?或者我需要调整光标?我只是更新了问题,希望我更清楚。太棒了,非常感谢!我希望你能帮我做最后的接触!!或者我只是想知道如何与香水的创造者相匹配?我很困惑,哈哈!如果你认为这样做会更容易,我也可以把我的路线和模板发送给你。嘿,伙计,冷静,我们是来帮你的。昨天,我的睡眠计划落后了,所以我无法调查。但是,我总是乐于助人。:)让我们。
{% for item in cursor &}
<perfume name>
<perfume brand>
<perfume description>
<perfume picture>
<author username (of the perfume)>
<author first and last names>
<date created>
<eventually other information>
{% if current_user == author %}
<button edit>
<button delete>
{% endif %}
<button review <=+ available to all logged in users>
{% endfor %}
{% for item in cursor['review'] <= this is not working %}
<perfume review>
<perfume review author>
<perfume review author avatar>
<eventually other information>
{% endfor %}
{
"_id" : ObjectId("5ebd7eec93256dc00c8f6f6c"),
"perfumeName" : "A new Perfume",
"perfumeBrand" : "A new Brand",
"perfumeDescription" : "<p>This is the description</p>",
"date_updated" : {
"$date" : "2020-05-14T16:43:10.801Z"
},
"perfumePicture" : "generic.png",
"isPublic" : false,
"perfumeType" : "Oriental",
"username" : "Guillermo",
"firstName" : "Guillermo",
"lastName" : "Brachetta",
"profilePicture" : null,
"userReviews" : [
{
"reviewId" : ObjectId("5ebd752c0a52cd0dade39492"),
"review_author" : "Guillermo",
"review" : "<p>This is one review</p>",
"review_author_first_name" : "Guillermo",
"review_author_last_name" : "Brachetta",
"review_author_email" : "brachetta@me.com",
"review_author_avatar" : "a92de23ae01cdfde.jpg"
}
]
}