Почему запрос mongodb не возвращает результат - PullRequest
0 голосов
/ 20 февраля 2019

Я использую $lookup с агрегацией $match, чтобы получить результат из двух коллекций на основе определенного условия.Ниже приведен мой запрос, который я использую в коде golang: -

 getCollection := sessionCopy.DB("Database").C("lead_section")
pipe := getCollection.Pipe([]bson.M{
    bson.M{"$match": bson.M{"status": 1}},
    bson.M{
        "$lookup": bson.M{
            "localField":   "_id",
            "from":         "lead_field",
            "foreignField": "lead_section_id",
            "as":           "custom_fields"}},
    // bson.M{"$unwind": "$custom_fields.status"},
    bson.M{"$match": bson.M{"custom_fields.status": 1}}})

запрос, приведенный выше, вернет мне этот результат

 [
        {
            "id": 1,
            "name": "Message",
            "status": 1,
            "custom_fields": [
                {
                    "id": 3,
                    "lead_section_id": 1,
                    "field_type": "text",
                    "help_text": "This is a tool tip",
                    "name": "Test11",
                    "status": 0
                },
                {
                    "id": 4,
                    "lead_section_id": 1,
                    "field_type": "text",
                    "help_text": "This is a tool tip",
                    "name": "Test11",
                    "status": 1
                },
                {
                    "id": 5,
                    "lead_section_id": 1,
                    "field_type": "text",
                    "help_text": "This is a tool tip",
                    "name": "Test11",
                    "status": 1
                }
            ]
        }
    ]

, но я хочу, чтобы результат, полученный с помощью канала, был столько status 1.Но в custom_fields первая запись с id:3, имеющая status:0

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Для этого вам понадобится $lookup с несколькими условиями соединения .

Например (с использованием оболочки монго):

db.lead_section.aggregate([
    { $match: {
        status: 1
    }},
    { $lookup: {
        from: "lead_field",    
        let: { lead_section: "$_id" },
        pipeline: [
            { $match: {
                $expr: {
                    $and: [
                        { $eq: [ "$lead_section_id", "$$lead_section" ] },                        
                        { $eq: [ "$status", 1 ] }
                    ]
                }
            }},            
        ],
        as: "custom_fields"
    }}
])
0 голосов
/ 20 февраля 2019

Так $match работает с полями массива.Он ищет совпадения в любом из поддокументов.В этом случае два других вложенных документа (идентификаторы 4 и 5) имеют статус 1, поэтому вся структура считается совпадающей и передается далее.

Другими словами, она фильтрует документы верхнего уровня.Не фильтрует вложенные массивы.

...