Проверить дубликаты определенного поля для массива документов с внутренним массивом - PullRequest
2 голосов
/ 13 мая 2019

У меня есть 2 объекта,

  {   
     _id: ObjectId("5cd9010310b80b3e38cd3f88") 
     subGroup: [
       bookList: [ 
         {
            title: "A good book",
            id: "abc123"
         }
       ]    
      ] 
  }

{    
     _id: ObjectId("5cd9010710b80b3e38cd3f89") 
     subGroup: [
       bookList: [ 
         {
            title: "A good book",
            id: "abc123"
         }
       ]    

Это 2 разных объекта.Я хотел бы обнаружить появление этих двух объектов, где дублируется заголовок (например, один и тот же).

Я пробовал этот запрос

 db.scope.aggregate({"$unwind": "$subGroup.bookList"}, {"$group" : { "_id": "$title", "count": { "$sum": 1 } } }, {"$match": {"id" :{ "$ne" : null } , "count" : {"$gt": 1} } })

, который я смотрел на другие потоки на stackoverflow.Тем не менее, это не возвращает мне ничего.Как я могу решить это?

1 Ответ

1 голос
/ 13 мая 2019

Здесь есть несколько вопросов:

  • $unwind должен работать на subGroup и subGroup.bookList отдельно
  • при указании _id для этапа $group следует использовать полный путь (subGroup.bookList.title)
  • на этапе $match вы хотите проверить, является ли _id (не id) $ne null

Попробуйте:

db.col.aggregate([
    {"$unwind": "$subGroup"}, 
    {"$unwind": "$subGroup.bookList"},
    {"$group" : { "_id": "$subGroup.bookList.title", "count": { "$sum": 1 } } },
    {"$match": { "_id" :{ "$ne" : null } , "count" : { "$gt": 1} } } 
])

игровая площадка Монго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...