2016-04-17 2 views
2

У меня есть две разные коллекции книг и музыки в формате JSON .Первый Даю пример коллекции книг:сравнить две коллекции в MongoDB

{ 
    "_id" : ObjectId("b1"), 
    "author" : [ 
     "Mary", 
    ], 
    "title" : "Book1", 
} 
{ 
     "_id" : ObjectId("b2"), 
     "author" : [ 
      "Joe", 
      "Tony", 
      "Mary" 
     ], 
     "title" : "Book2", 
} 
{ 
      "_id" : ObjectId("b3"), 
      "author" : [ 
       "Joe", 
       "Mary" 
      ], 
      "title" : "Book3", 
} 
....... 

Мэри пишет 3 книги, Джо написать 2 книги, Тони пишет 1 книгу. Во-второй я даю пример коллекции музыки:

{ 
     "_id" : ObjectId("m1"), 
     "author" : [ 
      "Tony" 
     ], 
     "title" : "Music1", 
    } 
    { 
      "_id" : ObjectId("m2"), 
      "author" : [ 
       "Joe", 
       "Tony" 
      ], 
      "title" : "Music2", 
    } 
    ....... 

Тони имеет 2 Гурджиев, Джо имеет 1 музыку, Мэри 0 музыки.

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

Таким образом, Мэри (3> 0) и Джо (2> 1) должны принимать во внимание, но не Тони (1 < 2). Таким образом, конечным результатом должно быть 2 (Мэри и Джо).

записывает следующий код, но не знает, как сравнивать:

db.book.aggregate([ 
    { $project:{ _id:0, author:1}}, 
    { $unwind:"$author" },  
    {$group:{_id:"$author", count:{$sum:1}}} 
    ] 
    ) 

db.music.aggregate([ 
    { $project:{ _id:0, author:1}}, 
    { $unwind:"$author" },  
    {$group:{_id:"$author", count:{$sum:1}}} 
    ] 
    ) 

ли это до сих пор не так ли? Как сделать следующее сравнение? Благодарю.

+0

Это [также ваша учетная запись] (http://stackoverflow.com/users/5862094/cacao) или вы оба можете работать вместе? Это почти [точный дубликат этого теперь удаленного вопроса] (http://stackoverflow.com/questions/36671480/how-to-compare-between-two-collections-in-mongodb), где единственная разница - это именование одной коллекции '' music ''(по какой-то странной причине), кроме« бумаги », как это было первоначально. Как уже было прокомментировано, это действительно просто «результаты цикла» для сравнения. Если вы хотите что-то более совершенное, тогда вместо этого поместите все данные в «одну» коллекцию. –

ответ

0

Чтобы решить эту проблему, нам нужно использовать фазу $ out и сохранить результат обоих запросов в промежуточной коллекции, а затем использовать агрегированный запрос для присоединения к ним ($ lookup).

db.books.aggregate([{ 
      $project : { 
       _id : 0, 
       author : 1 
      } 
     }, { 
      $unwind : "$author" 
     }, { 
      $group : { 
       _id : "$author", 
       count : { 
        $sum : 1 
       } 
      } 
     }, { 
      $project : { 
       _id : 0, 
       author : "$_id", 
       count : 1 
      } 
     }, { 
      $out : "bookAuthors" 
     } 
    ]) 

db.music.aggregate([{ 
      $project : { 
       _id : 0, 
       author : 1 
      } 
     }, { 
      $unwind : "$author" 
     }, { 
      $group : { 
       _id : "$author", 
       count : { 
        $sum : 1 
       } 
      } 
     }, { 
      $project : { 
       _id : 0, 
       author : "$_id", 
       count : 1 
      } 
     }, { 
      $out : "musicAuthors" 
     } 
    ]) 

db.bookAuthors.aggregate([{ 
      $lookup : { 
       from : "musicAuthors", 
       localField : "author", 
       foreignField : "author", 
       as : "music" 
      } 
     }, { 
      $unwind : "$music" 
     }, { 
      $project : { 
       _id : "$author", 
       result : { 
        $gt : ["$count", "$music.count"] 
       }, 
       count : 1, 
      } 
     }, { 
      $match : { 
       result : true 
      } 
     } 
    ]) 

EDIT ИЗМЕНЕНИЯ:

используется поле автора вместо _ID

добавлен логическое утверждение Embeded в документе в фазе $ проекта

результат: {$ Gt: [ "$ количеству "," $ music.count "]

Любые вопросы приветствуются! Веселитесь!

+0

Привет, Я следую вашему предложению и встречаюсь с некоторыми проблемами, и запишите его в свой ответ, Спасибо! – testcode

+0

@testcode - найти мой полный запрос dump – profesor79

+0

Мне просто нужно получить число авторов, которые больше записывают музыку, поэтому мне нужно добавить {$ group: _id: null, number: {$ sum: 1} } После $ match? это правильно? – testcode

Смежные вопросы