2016-11-25 5 views
0

Есть два мангуст схемаагрегация MongoDB и сортировка по moongoose схемы

const bookModel = new Schema({ 
    title : String, 
    content: String, 
    author:{ 
     id:{ 
      type: ObjectId, 
     }, 
     name:{ 
      type: String, 
     } 
    } 
}) 


const commentModel = new Schema({ 
    text :String, 
    bookid :{ { type : ObjectId , required : true } }, 
    inEnglish:{ 
     type: Boolean, 
     default:false 
    } 
}) 

как мы можем написать Монго запроса, чтобы найти известные книги на основе количества комментариев

так, написать найти запрос сортировать книги на основе количества комментариев (в которых inEnglish задано значение true) в отдельных книгах.

JSON хранится в Монго как:

Книга JSON-

{ 
    "_id" :ObjectId(58368df330391521247f6aeb), 
    "title": "Dan Brown", 
    "content": "COntent of the book" 
} 

Комментарий JSON-

{ 
     "_id" :ObjectId(24568df330391765434f6fgh), 
     "text":"Nice Book", 
     "bookid":"58368df330391521247f6aeb", 
     inEnglish: true 

} 
+0

Вы еще не писали ни одного вопроса? Я имею в виду, вы что-то пробовали и где-то застряли? –

+0

'db.comments.aggregate ( {$ match: {inEnglish: true}}, {$ group: {_id: {bookId:" $ bookId "}," totalC ": {$ sum: 1}}}, {$ sort: {"_id.totalC": 1}}) ' Я пробовал это, но он не работает – lee

ответ

0

я создал небольшую коллекцию

>db.comments.find() 

{"_id" : ObjectId("58387da2a32c4b96e67ec6b4"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aeb", "inEnglish" : true } 
{"_id" : ObjectId("58387da8a32c4b96e67ec6b5"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aeb", "inEnglish" : true } 
{"_id" : ObjectId("58387da9a32c4b96e67ec6b6"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aeb", "inEnglish" : true } 
{"_id" : ObjectId("58387da9a32c4b96e67ec6b7"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aeb", "inEnglish" : true } 
{"_id" : ObjectId("58387db0a32c4b96e67ec6b8"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aec", "inEnglish" : true } 
{"_id" : ObjectId("58387db2a32c4b96e67ec6b9"), "text" : "Nice Book", "bookid" : "58368df330391521247f6aec", "inEnglish" : true } 

сейчас, чтобы получить закажите комментарии, я запустил после

db.comments.aggregate(
    {$group : {_id : "$bookid", "count" : {$sum : 1}}}, 
    {$sort : {"count" : -1}}, 
    {$limit : 1} 
) 

В основном то, что я делаю, является группой по идентификатору книги и получает счет.

мой выход

{ "_id" : "58368df330391521247f6aeb", "count" : 4 } 

примечание: я не делаю фильтров с использованием inEnglish: верно. если хотите, вы можете включить это в запрос,

+0

С вышеуказанным запросом вы сможете найти только идентификатор книги. Попробуйте этот запрос, чтобы получить подробную информацию о книге ** db.getCollection ('comments'). Aggregate ([ {$ group: {_id: "$ bookid", "count": {$ sum: 1}}}, {$ sort: {"count": -1}}, {$ limit: 1}, {$ lookup: {from: "books", localField: "_id", foreignField: "_id", as: " книги "}} ]) ** –

+0

это не работает – lee

+0

какой вы имеете в виду тот, который я дал, или тот, который дал Аниш? –