MongoDB: Как сравнить значения объекта со значениями массива и добавить поле в этот объект - PullRequest
1 голос
/ 01 апреля 2020

У меня есть MongoDB с такой структурой:

enter image description here

Регистрация - это массив, и его объект выглядит так:

{
        "_id" : ObjectId("5e844235ead49b7ff33962d3"), 
        "date" : "2-jul", 
        "firstname" : "John", 
        "lastname" : "Doe", 
        "email" : "john@doe.com", 
        "education" : "University", 
        "gender" : "male", 
        "age" : "32", 
        "workshop" : [2,3,6]
}

И известный выглядит следующим образом:

"known" : [
        "tina@hotmail.com", 
        "sanders@hotmail.com", 
        "kyrana@hotmail.com"
]

Как проверить, существует ли registrations.email в known? Если оно существует, как вы можете добавить поле к регистрации: emailIsKnown: true или emailIsKnown: false?

Я пробовал разные варианты фильтра, заменил Root, lookUp на конвейеры и mergeObject. Но я не могу понять, как выполнить только sh минимум сравнения результатов или добавления поля в объект регистрации.

1 Ответ

1 голос
/ 01 апреля 2020

Вы можете сделать это, используя агрегационный конвейер , попробуйте запрос ниже:

db.collection.aggregate([
  /** Re-create 'registration' array field */
  {
    $addFields: {
      registration: {
        $map: {
          input: "$registration", // Iterate on 'registration' array
          in: {
            $cond: [
              { $in: ["$$this.email", "$known"] }, // Check if current object's email exists in 'known' array
              { $mergeObjects: [{ emailIsKnown: true }, "$$this"] }, // If Yes, add new field with true to existing Object
              { $mergeObjects: [{ emailIsKnown: false }, "$$this"] } // If No, add new field with false to existing Object
            ]
          }
        }
      }
    }
  }
]);

Тест: MongoDB-Playground

...