Как выбрать двухуровневую структуру данных в MongoDB? - PullRequest
0 голосов
/ 05 сентября 2018

Я разрабатываю приложение для онлайн-покупок, которое имеет двухуровневый тип продукта Сейчас я использую MongoDB для его хранения. Мой язык программирования - TypeScript.

Моя модель, как показано ниже:

class ProductTypeModel {
    _id: ObjectID;
    name: string;
    sort: number;   // sort
    status: number; // enable | disable
    children: Object[]; // sub types, like [{ _id: ObjectID('xx', name: 'xx', sort: xx, status: xx) }]
    create_time: Date;
    update_time: Date;
}

Если у нас есть данные, как показано ниже:

{
    "_id" : ObjectId("5b8fe56218de48345a6b7079"),
    "create_time" : ISODate("2018-09-05T14:17:06.912Z"),
    "update_time" : ISODate("2018-09-05T14:17:06.912Z"),
    "name" : "Books",
    "sort" : 0,
    "status" : 1,
    "children" : [
        {
            "_id" : ObjectId("5b8fe56218de48345a6b7075"),
            "name" : "Computer",
            "sort" : 1,
            "status" : 1
        },
        {
            "_id" : ObjectId("5b8fe56218de48345a6b7076"),
            "name" : "Math",
            "sort" : 2,
            "status" : 0
        },
        {
            "_id" : ObjectId("5b8fe56218de48345a6b7077"),
            "name" : "Novel",
            "sort" : 3,
            "status" : 1
        }
    ]
}

Как выбрать типы и дочерние типы с помощью status=1?

Мое текущее решение состоит в том, чтобы сначала выбрать базовые типы и пройти, чтобы исключить потомков, у которых status равно 0. Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 05 сентября 2018

Этап агрегации $ redact это сделает работу:

    db['03'].aggregate(
    [
        {
            $redact: {
                $cond: {
                      if: { $eq: [ "$status", 1 ] },
                      then: "$$DESCEND",
                      else: "$$PRUNE"
                    }
            }
        },
    ],
);

вывод:

{ 
    "_id" : ObjectId("5b8fe56218de48345a6b7079"), 
    "create_time" : ISODate("2018-09-05T16:17:06.912+0200"), 
    "update_time" : ISODate("2018-09-05T16:17:06.912+0200"), 
    "name" : "Books", 
    "sort" : NumberInt(0), 
    "status" : NumberInt(1), 
    "children" : [
        {
            "_id" : ObjectId("5b8fe56218de48345a6b7075"), 
            "name" : "Computer", 
            "sort" : NumberInt(1), 
            "status" : NumberInt(1)
        }, 
        {
            "_id" : ObjectId("5b8fe56218de48345a6b7077"), 
            "name" : "Novel", 
            "sort" : NumberInt(3), 
            "status" : NumberInt(1)
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...