Получение информации из двух коллекций в MongoDB - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь использовать две коллекции (отзывы и продукты), чтобы найти название и описание продуктов, проверенных рецензентом «А». Мне просто нужно отобразить заголовок и описание. Ничего больше. На данный момент у меня есть:

db.reviews.aggregate([
    {$match: {reviewer : 'A'}},
    {$lookup: {
        from: "products",
        localField: "reviewer", 
        foreignField: "title", 
        foreignField: "description",
        as: "products_docs"}},
    {$project: {
        _id: 0,
        reviewerID: 1,
        title: 1, 
        description: 1
    }}    
    ])

Предполагается, что есть два продукта, которым текущий вывод пока дает идентификатор, но не название или описание.

/* 1 */
{
    "reviewerID" : "A"
}

/* 2 */
{
    "reviewerID" : "A"
}

Я что-то упустил ?

образец документов:

обзор:

{
    "_id" : ObjectId("5d0b70f2d7367de7f5fa1589"),
    "reviewerID" : "A",
    "asin" : "1",
    "reviewerName" : "Bob",
    "helpful" : [ 
        0, 
        0
    ],
    "reviewText" : "It was really good.",
    "overall" : 1.0,
    "summary" : "Brilliant",
    "unixReviewTime" : 1402185600,
    "reviewTime" : "06 8, 2014"
}

изделие:

{
    "_id" : ObjectId("5d0b6d1cd7367de7f58b4906"),
    "asin" : "1",
    "description" : "Perfect for sunny days",
    "title" : "Sunglasses",
    "imUrl" : "/sunglasses.jpg",
    "related" : {
        "also_bought" : [ 
            "729300236X"
        ]
    },
    "salesRank" : {
        "Shoes" : 257607
    },
    "categories" : [ 
        [ 
            "Clothing, Shoes & Jewellery", 
            "Women", 
            "Accessories", 
            "Sunglasses & Eyewear Accessories", 
            "Sunglasses"
        ], 
        [ 
            "Clothing, Shoes & Jewellery", 
            "Men", 
            "Accessories", 
            "Sunglasses & Eyewear Accessories", 
            "Sunglasses"
        ]
    ]
}


1 Ответ

0 голосов
/ 25 февраля 2020

Вы можете сделать это, используя $ lookup . Попробуйте выполнить следующий запрос:

db.review.aggregate([
    /** filtering out review coll to get required doc */
    {
        $match: {
            "reviewerID": "A"
        }
    },
    {
        $lookup: {
            from: "product",
            let: {
                asin: "$asin" // creating local variable from review Coll's field
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: [
                                "$asin", // foreign field
                                "$$asin" // local variable created in let
                            ]
                        }
                    }
                },
                /** projecting only required fields from product Coll */
                {
                    $project: {
                        description: 1,
                        title: 1,
                        _id: 0
                    }
                }
            ],
            as: "data"
        }
    }
])

Тест: MongoDB-Playground

...