Отладка mongoDB с помощью printjson в оболочке mongo

1

Я пытаюсь отлаживать запрос printjson с использованием printjson во временных шагах кодирования. Я смог достичь аналогичного вывода printjson из трех коллекций с различными структурами в качестве промежуточного шага. Я думал, что это позволяет мне использовать общий код, начиная с этого момента, для всех трех разных коллекций. Однако, похоже, это не работало. Две коллекции вели себя как ожидающие, но третий не сделал на следующем этапе кодирования (используя функцию Object.keys). У меня есть три вопроса:

  1. Является ли printjson хорошим инструментом для отладки?
  2. Почему код с аналогичным выходом printjson, как промежуточный шаг, ведет себя по-другому на следующем этапе кодирования?
  3. Как я могу исправить код запроса в layouts3 чтобы получить аналогичный результат, полученный с помощью layouts1 и layouts2?

Три различные коллекции: layouts1, layouts2 и layouts3:

db.layouts1.insert({
    "_id": ObjectId("58e574a768afb6085ec3a388"),
    "positions": [{
            "_id":      ObjectId("58e55f0f68afb6085ec3a2cc"),
            "cyan" :    [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2d0")}],
            "magenta":  [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cd")}],
            "yellow":   [{"unit": "08","side": "3","_id": ObjectId("58e55f0f68afb6085ec3a2ce")}],
            "black":    [{"unit": "08","side": "5","position": "Far","_id": ObjectId("58e55f0f68afb6085ec3a2cf")}]
        }]
});

db.layouts2.insert({
    "_id" : ObjectId("58e574a768afb6085ec3a388"),
    "pages" : [{
            "_id"       : ObjectId("58e542fb68afb6085ec3a1d2"),
            "positions" : [ 
                        {"cyan":     [{ "unit" : "08", "side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d6")}]}, 
                        {"magenta":  [{"unit" : "08","side" : "5","position" : "Drive Side Far","_id" : ObjectId("58e542fb68afb6085ec3a1d3")}]},
                        {"yellow":   [{"unit" : "08","side" : "3","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d4")}]},
                        {"black":    [{"unit" : "08","side" : "5","position" : "Far","_id" : ObjectId("58e542fb68afb6085ec3a1d5")}]}
                            ]
                        }]
            });

db.layouts3.insert({
    "_id":              ObjectId("58e574a768afb6085ec3a388"),
    "pages": [{
        "_id":          ObjectId("58e542fb68afb6085ec3a1d2"),
        "positions":    [{ "_id": ObjectId("58e55f0f68afb6085ec3a2cc"),
            "cyan":     [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2d0") }],
            "magenta":  [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cd") }],
            "yellow":   [{ "unit": "08", "side": "3", "_id": ObjectId("58e55f0f68afb6085ec3a2ce") }],
            "black":    [{ "unit": "08", "side": "5", "position": "Far", "_id": ObjectId("58e55f0f68afb6085ec3a2cf") }]
        }]}]});

Ниже приведен код, необходимый для получения вывода, который, как представляется, имеет аналогичную структуру данных, как судить по просмотру вывода printjson, для каждой из трех коллекций.

db.layouts1.find().forEach(doc => { doc.positions = doc.positions
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions
        .filter(positionKey => positionKey !== "_id") // Returns a new array without _id
        .forEach(positionKey => { printjson(position[positionKey])})})})

db.layouts2.find().forEach(doc => { doc.pages = doc.pages
.map( page => { page.positions
    .forEach( position => { Object.keys(position)
        .forEach( positionKey => {printjson(position[positionKey])})})})})


db.layouts3.find().forEach(doc => { doc.pages = doc.pages
    .map(page => { page.positions // page.positions mapped and is []
        .forEach(position => { Object.keys(position) // returns one array with _id, cyan, magenta, etc.
            .forEach(positionKey => { printjson(position[positionKey])})})})})

Ниже приведен код, который работает для layouts1, layouts2, но НЕ предназначен для layouts3:

db.layouts1.find().forEach(doc => { doc.positions = doc.positions
    .map(position => { Object.keys(position) // Returns a new array conaining all keys for positions
        .filter(positionKey => positionKey !== "_id") // Returns a new array without _id
        .forEach(positionKey => { position[positionKey]
            .forEach(colorDetails => { printjson(Object.keys(colorDetails))
            })})})})

db.layouts2.find().forEach(doc => { doc.pages = doc.pages
.map( page => { page.positions
    .forEach( position => { Object.keys(position)
        .forEach( positionKey => {position[positionKey]
        .forEach( colorDetails => { printjson(Object.keys(colorDetails))}) }) })})})

СЛЕДУЮЩИЕ НЕ РАБОТАЮТ. Он вызывает следующую ошибку: TypeError: position[positionKey].forEach is not a function

db.layouts3.find().forEach(doc => { doc.pages = doc.pages
    .map(page => { page.positions // page.positions mapped and is []
        .forEach(position => {Object.keys(position)
            .forEach(positionKey => { position[positionKey]
                .forEach( colorDetails => { printjson(Object.keys(colorDetails))
                })})})})})
Теги:
arrays

1 ответ

1
Лучший ответ
  1. printjson, по-видимому, является хорошим инструментом для отладки, он помог мне определить проблему
  2. На самом деле код немного, и трудно заметить, вывод printjson. Код, который не работал, имел ObjectId("58e55f0f68afb6085ec3a2cc") поверх вывода
  3. Код, необходимый для получения схожих результатов с результатом, созданным с помощью layouts1 и layouts2, выглядит следующим образом:

    db.layouts3.find().forEach(doc => { doc.pages = doc.pages.map(page => { page.positions//page.positions mapped and is [].forEach(position => {Object.keys(position)//Filter the "_id" field which is needed to remove the "_id" field.filter(positionKey => positionKey !== "_id").forEach(positionKey => { position[positionKey].forEach( colorDetails => { printjson(Object.keys(colorDetails)) })})})})})

Ещё вопросы

Сообщество Overcoder
Наверх
Меню