Использование $match для запроса из разных массивов с одинаковым значением ключа

#mon&odb #express #a&&re&ation-framework

#mon&odb #выразить #агрегация-фреймворк

Вопрос:

Предположим, у меня есть эти простые JSON-данные из двух документов, оба с двумя разными массивами, а именно carPolicies и paPolicies . Внутри этих массивов находятся объекты, названные как policy , где он содержит ключ ‘a&ent’, значение которого равно ’47’.

 {
    "_id": {
        "$oid": "some_id"
    },
    "name": "qwe",
    "password": "pw",
    "carPolicies": [
        {
            "policy": { 
                "a&ent": "47"
            }
        },
        {
            "policy": {                   
                "a&ent": "47"
            }
        }
    ],
    "paPolicies": [
        {
            "policy": {                  
                "a&ent": "47"
            }
        },
        {
            "policy": {                   
                "a&ent": "47"
            }
        }
    ]
}


{
    "_id": {
        "$oid": "some_id"
    },
    "name": "rty",
    "password": "wp",
    "carPolicies": [
        {
            "policy": { 
                "a&ent": "47"
            }
        },
        {
            "policy": {                   
                "a&ent": "47"
            }
        }
    ],
    "paPolicies": [
        {
            "policy": {                  
                "a&ent": "47"
            }
        },
        {
            "policy": {                   
                "a&ent": "47"
            }
        }
    ]
}
  

Используя оператор Mon&oDB $match, как мне создать запрос, который, если значение агента равно 47 в любом массиве, возвращает мне имя документа?

Это то, что у меня сейчас есть:

 db.collection('users').a&&re&ate([
    // Get just the docs that contain an a&ent element where a&ent is === req.params.name
    {$match: {$or: [{'paPolicies.policy.a&ent': req.params.name}, {'carPolicies.policy.a&ent': req.params.name}]} }, 
    {
        $project: {
            policy: {
                $filter: {
// how to do an 'or' operator at 'input' so it can be input: '$paPolicies.policy || $carPolicies.policy' 
                    input: '$paPolicies.policy',
                    as: 'police',
                    cond: { $eq: ['$$police.a&ent', req.params.name]}
                }
            },
            _id: 1, name: 1
        }
    }
])
  

Я знаю, что приведенный выше код неверен, но я чувствую, что это самое близкое, что я могу сейчас найти к решению, и, надеюсь, дает представление о том, чего я пытаюсь достичь.

Ответ №1:

Если я правильно понял требование. Как насчет простого использования dot(.) обозначения в .find() запросе с проекцией в качестве второго параметра.

 db.collection.find({
  $or: [
    {
      "carPolicies.policy.a&ent": "47"
    },
    {
      "paPolicies.policy.a&ent": "47"
    }
  ]
},
{
  "_id": 1,
  "name": 1
})
  

Комментарии:

1. Позвольте мне попробовать это, и я свяжусь с вами!

2. Ссылка на игровую площадку @BrioTech проверьте это, если это то, что вы ищете.

3. Я принял ваш ответ. Простой и понятный вариант. Возможно, я переосмыслил свою проблему, посмотрев на ваше решение, ха-ха

4. Кроме того, спасибо, что помогли мне открыть mon&o play&round!