聚合3个MongoDB集合-(Python、Flask、Jinja)

聚合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(

多亏了这里提供的巨大帮助,我在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(
        [
            {
                "$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"
        }
    ]
}