MongoDB - 如何判断每个文档在聚合匹配后是否有完全匹配的元素数组

MongoDB - How to tell if every document has an exactly matching element array after an aggregate match

我有 collection 个与此类似的文档:

{
    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
}

我无法比较每个文档的 set/array 标题,看看它们是否完全相同,因为我没有 aggregate/match。一些文档可以有 empty/null 个标题数组,如果它们都是 empty/null,那就是匹配

聚合可能是

  • $addToSet 有助于删除重复项。所以我们将有两个数组,一个集合(Titles)和一个原始数组('original')
  • 比较两个数组。如果两者不相等,则有一个 various.

剧本是

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 playground