MongoDB — как определить, имеет ли каждый документ точно совпадающий массив элементов после совокупного совпадения

#mongodb #aggregation-framework #mongodb-.net-driver

#mongodb #структура агрегации #mongodb-.net-driver

Вопрос:

У меня есть коллекция документов, похожих на это:

 {
    Name : "Name1",
    Product : 1012,
    Titles : [ { 
         Id: 5,  
         Title: "FirstTitle" 
         }, 
         {
         Id: 75,
         Title: "SecondTitle"
         }
 },
 {
    Name : "Name1",
    Product : 2014,
    Titles : [ { 
         Id: 5,  
         Title: "FirstTitle" 
         }, 
         {
         Id: 75,
         Title: "SecondTitle"
         }
 }
 

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

 {
    Name : "Name1,
    TitlesVaries : false
    Titles : [ { 
         Id: 5,  
         Title: "FirstTitle" 
         }, 
         {
         Id: 75,
         Title: "SecondTitle"
         }
}
 

Если они разные, я хочу это знать.

 {
    Name : "Name1"
    TitlesVaries : true
    Titles : null
}
 

У меня возникли проблемы с сравнением заголовков наборов / массивов для каждого документа, чтобы увидеть, все ли они одинаковы после того, как у меня нет моего агрегата / совпадения. Некоторые документы могут иметь пустые / нулевые массивы заголовков, и если все они пустые / нулевые, это совпадение

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

1. Поможет ли вам ответ?

Ответ №1:

Объединение может быть

  • $addToSet помогает удалять дубликаты. Итак, у нас будет два массива, которые представляют собой Set ( Titles ) и исходный массив (‘original’)
  • Сравните оба массива. Если оба не равны, то существует различное.

Сценарий

 db.collection.aggregate([
  {
    $group: {
      _id: "$Name",
      Titles: { $addToSet: "$Titles" },
      original: { $push: "$Titles" }
    }
  },
  {
    $project: {
      Titles: {
        $cond: [
          {
            $or: [
              {
                $ne: [
                  { $size: "$Titles" },
                  { $size: "$original" }
                ]
              },
              {
                $eq: [ {  $size: "$original"  }, 1 ]
              }
            ]
          },
          "$Titles",
          null
        ]
      },
      TitlesVaries: {
        $ne: [
          { $size: "$Titles" }, { $size: "$original" }
        ]
      }
    }
  }
])
 

Рабочая игровая площадка Mongo