как перебрать курсор в mongodb? - PullRequest
0 голосов
/ 23 октября 2019

Мое текущее назначение спрашивает

The queries listed below must be implemented by iterations over a cursor. 

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

Первый вопрос:

 List the title and total number of keywords for each book. If a book has no
keywords, the total number of keywords must be 0 (zero). 

Вот соответствующий сценарий JS

db.bookshop.insert( {
    "_id":"185.3.16",
    "book": {
        "callnum":"185.3.16",
        "isbn":"1-292-06118-9",
        "title":"Database Systems",
        "authors":[
            {
                "fname":"Thomas",
                "lname":"Connolly"},
            { 
                "fname":"Carolyn",
                "lname":"Begg"}
        ],
        "publisher":"Pearson Pty Ltd",
        "year":2015,
        "price":136.99,
        "topic":"Computer Science",
        "description":"This is the 6th edition. You can register online to access the examples",
        "keywords":["Database", "XML", "Distributed"]
        }
});

db.bookshop.insert( {
    "_id":"163.24.12",
    "book": {
        "callnum":"163.24.12",
        "isbn":"1-123-456-810",
        "title":"Core Java",
        "authors":[
            {
                "fname":"Horstmann",
                "lname":"Cornell"}
        ],
        "publisher":"PH Pty Ltd",
        "year":2012,
        "price":142.90,
        "topic":"Computer Science",
        "description":"It covers JAVA programming and JAVA script",
        "keywords":["JAVA", "XML", "Script"]
    }
});

db.bookshop.insert( {
    "_id":"123.45.67",
    "book": {
        "callnum":"123.45.67",
        "isbn":"1-123-456-789",
        "title":"Algorithms",
        "authors":[
            {
                "fname":"James",
                "lname":"Bond"},
            {
                "fname":"Harry",
                "lname":"Potter"},
            {
                "fname":"William",
                "lname":"Stallings"}
        ],
        "publisher":"Pearson Pty Ltd",
        "year":2013,
        "price":65.85,
        "topic":"Computer Science",
        "description":"It contains algorithms and their applications. You can download examples from the website"
    }
});
db.bookshop.insert( {
    "_id":"134.41.33",
    "book": {
        "callnum":"134.41.33",
        "isbn":"1-213-431-770",
        "title":"C++ Programming",
        "authors":[
            {
                "fname":"Larry",
                "lname":"Peterson"}
        ],
        "publisher":"Pearson Pty Ltd",
        "year":2010,
        "price":74.90,
        "topic":"Computer Science",
        "description":"C++ programming and its applications",
        "keywords":["C++", "Class", "Overloading", "Inheritance"]
    }
})

это моя попытка

var myCursor = db.bookshop.aggregate([]).pretty();

while (myCursor.hasNext()) {
   var x = myCursor.next();
   if(x.book)
   print(tojson(x));
};

while (myCursor.hasNext()) {
   var x = myCursor.next();
   if(x.journal)
   print(tojson(x));
};

while (myCursor.hasNext()) {
   var x = myCursor.next();
   if(x.musicCD)
   print(tojson(x));
};

while (myCursor.hasNext()) {
   var x = myCursor.next();
   if(x.magazine)
   print(tojson(x));
};

эта попытка печатаетно не в счет.

Если бы кто-то мог объяснить концепцию с помощью вопроса, который я задал, то это было бы очень признательно!

1 Ответ

0 голосов
/ 23 октября 2019

что означает итерация над курсором?

позволяет сначала увидеть что такое курсор?

Простыми словами, курсор является результатом после выполнения запроса.

Таким образом, данные / результат, возвращаемые после выполнения запроса, являются курсором.

Подробнее о курсоре

Исходя из предоставленного вами описания вопроса, я понимаю:

Вам необходимо сформировать запрос для выполнения ваших задач и выполнить итерацию по результату запроса, чтобы вывести результаты.

Сценарий, предоставленный вами, заключается в том, чтобы вставить эти данные в БД, а затем выполнить ваши операции / задачи с этими вставленными данными.

Каким будет запрос?

Я оставлю их вам,

попробуйте ...

Если вам нужна помощь,

обновите ваш вопрос с примерами кода, которыеВы пытались ...

ПОСЛЕ КОММЕНТАРИЙ:

Вот решение :

db.bookshop.aggregate({$match:{}},
    {$project:{"book.title":1, keywords: {$ifNull: ["$book.keywords", []]}}},
    {$project:{"book.title":1, noOfKeywords:{$size:"$keywords"}}})

Я использовал $ifNull оператор , чтобы проверить, существует ли массив ключевых слов в объекте книги в каждом документе,

в этой строке

{$ifNull: ["$book.keywords", []]}

если массив ключевых слов равен нулю или не существует , тогда он заменит поле ключевого слова этого конкретного документа на [] в объекте книги.

Затем в следующем $project stage , я использовал оператор $size для подсчета размера массива, и это ваш ответ.

...