Создать представление mongodb для вложенных коллекций

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

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

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
1
задан xeon 21 January 2019 в 07:15
поделиться

1 ответ

Таким образом, ключевым моментом здесь является оператор $ unwind , который преобразует массив из n элементов в n элементов с одним вложенным документом.

db.createView(
    "yourview",
    "yourcollection",
    [ { $unwind: "$books" } ]
)

Это даст вам документы в следующем формате:

{ author: "aa", books: { title: "a", pages: 100 } },
{ author: "aa", books: { title: "b", pages: 200 } },
{ author: "ab", books: { title: "c", pages: 80 } },
{ author: "ab", books: { title: "d", pages: 150 } }

РЕДАКТИРОВАТЬ: чтобы иметь ключи с точками в именах, вы можете запустить команду:

db.createView(
    "yourview",
    "yourcollection",
    [   
        { $unwind: "$books" },
        {
            $project: {
                author: 1,
                books2: {
                    $map: { 
                        input: { $objectToArray: "$books" },
                        as: "book",
                        in: {
                            k: { $concat: [ "books.", "$book.k" ] },
                            v: "$book.v"
                        }
                    }
                }
            }
        },
        {
            $replaceRoot: {
                newRoot: { $mergeObjects: [ { author: "$author" }, { $arrayToObject: "$books2" } ] }
            }
        } 
    ]
)

В основном он использует $ objectToArray и $ arrayToObject , чтобы «заставить» MongoDB возвращать поля с точками в именах. Выходы:

{ "author" : "aa", "books.title" : "a", "books.pages" : 100 }
{ "author" : "aa", "books.title" : "b", "books.pages" : 200 }
{ "author" : "ab", "books.title" : "c", "books.pages" : 80 }
{ "author" : "ab", "books.title" : "d", "books.pages" : 150 }
0
ответ дан mickl 21 January 2019 в 07:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: