Агрегация и сортировка 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

}

person lee    schedule 25.11.2016    source источник
comment
вы написали какой-нибудь запрос еще? я имею в виду, вы пробовали что-то и где-то застряли?   -  person satish chennupati    schedule 25.11.2016
comment
db.comments.aggregate( { $match : { inEnglish : true} }, {$group : { _id: {bookId :"$bookId"}, "totalC":{$sum:1}}}, {$sort : {"_id.totalC":1}}) я пробовал это, но это не работает   -  person lee    schedule 25.11.2016


Ответы (1)


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

>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:true. если вы хотите, вы можете включить это в запрос,

person satish chennupati    schedule 25.11.2016
comment
С помощью вышеуказанного запроса вы сможете найти только идентификатор книги. Попробуйте этот запрос, чтобы получить сведения о книге db.getCollection('comments').aggregate([ {$group : {_id : $bookid, count : {$sum : 1}}}, {$sort : {count : -1}}, {$limit : 1}, { $lookup : { from: books, localField: _id, ForeignField: _id, as: books } } ]) - person Anish Agarwal; 26.11.2016
comment
какой из них вы имеете в виду тот, который я дал, или тот, который дал Аниш? - person satish chennupati; 27.11.2016