Фильтр MongoDB с интегрированной структурой - PullRequest
1 голос
/ 24 января 2020

У меня есть документ mongoDb в этом формате

{
   account_key : "tiziano",
   notifications : [
       { address: "tiziano@myemail.com" , notification_type: ['booking_confirmation','booking_deletion'] },
       { address: "tiziano@youremail.com" , notification_type: ['booking_confirmation'] },
       { address: "tiziano@yxyzEmail.com" , notification_type: ['credit_card_expiration'] },
   ]
} 

, и собрание содержит n документов в этой форме. Я пытаюсь получить все документы, у которых есть один указанный c account_key, и для каждого документа, который соответствует поиску, я хотел бы иметь тип уведомлений, который соответствует определенным c критериям. Например, я хотел бы получить обратно все уведомления, которые имеют уведомление_type booking_confirmation

    {
        account_key: "tiziano",
        notifications : [
            { address: "tiziano@myemail.com" , notification_type: ['booking_confirmation','booking_deletion'] },
            { address: "tiziano@youremail.com" , notification_type: ['booking_confirmation'] }
        ]
    }

Это запрос, который я использую, но он не возвращает то, что я хочу

db.getCollection("accounts").aggregate([
    { $match : { account_key : "acme" }},
    { $project : {
        notification_contact: {
            $filter: {
                input: "$notifications",
                as: "notification",
                cond: {  $eq : ["$$notification.notification_type", "booking_created"] }
            }
        } 
    }}
])

1 Ответ

0 голосов
/ 24 января 2020

Вам необходимо $in, чтобы проверить, содержит ли массив указанный c элемент.

db.collection.aggregate([
  { "$match": { "account_key": "tiziano" } },
  { "$project": {
    "notification_contact": {
      "$filter": {
        "input": "$notifications",
        "as": "notification",
        "cond": {
          "$in": [
            "booking_confirmation",
            "$$notification.notification_type"
          ]
        }
      }
    }
  }}
])

MongoPlayground

...