WedX - журнал о программировании и компьютерных науках

подзапрос заменяет значение, завернутое в список в коллекции A, для ключа в коллекции B mongodb

У меня есть вопрос с mongodb

В моей базе 2 коллекции, имена status и menu

Первичный ключ в status _id является внешним ключом для значения купленного списка в коллекции menu

Для коллекции status:

{
    "_id": "green", "description": "running"
}
{
    "_id": "yellow", "description": "prepareing"
}
{
    "_id": "black", "description": "closing"
}
{
    "_id": "red", "description": "repairing"
}

Для коллекции menu:

{
    "name": "tony",
    "bought": [
        {
            "notebook": "green"
        },
        {
            "cellphone": "red"
        }
    ]
}
{
    "name": "andy",
    "bought": [
        {
            "fan": "black"
        }
    ]
}

Как я могу запросить, чтобы получить следующий ответ?

(Просто замените description на _id)

{
    "name": "tony",
    "bought": [
        {
            "notebook": "running"
        },
        {
            "cellphone": "repairing"
        }
    ]
}

Это проблема подзапроса для NoSQL? Как я могу использовать ключевое слово для Google?

18.11.2017

Ответы:


1

Вот версия с использованием агрегата:

Мы начинаем с этапа $unwind для извлечения каждого купленного в отдельная строка

Затем $objectToArray для нормализации купленного поля.

Затем мы можем выполнить $lookup, чтобы присоединиться к статусу.

Затем мы используем $group для перегруппировки по имени.

И $arrayToObject для сброса купленного в денормализованный стиль

> db.menu.find()
{ "_id" : ObjectId("5a102b0b49b317e3f8d6268b"), "name" : "tony", "bought" : [ { "notebook" : "green" }, { "cellphone" : "red" } ] }
{ "_id" : ObjectId("5a102b0b49b317e3f8d6268c"), "name" : "andy", "bought" : [ { "fan" : "black" } ] }
> db.status.find()
{ "_id" : "green", "description" : "running" }
{ "_id" : "yellow", "description" : "prepareing" }
{ "_id" : "black", "description" : "closing" }
{ "_id" : "red", "description" : "repairing" }
> db.menu.aggregate([
{$unwind: '$bought'}, 
{$project: {name: 1, bought: {$objectToArray: '$bought'}}}, {$unwind: '$bought'}, 
{$lookup: {from: 'status', localField: 'bought.v', foreignField: '_id', as: "status"}}, 
{$project: {name: 1, bought: ["$bought.k", { $arrayElemAt: ["$status.description", 0]}]}}, 
{$addFields: {b: {v: {$arrayElemAt: ['$bought', 1]}, k: { $arrayElemAt: ['$bought', 0]}}}}, 
{$group: {_id: { name: '$name', _id: "$_id"}, b: {$push: "$b"}}},     
{$project: {_id: "$_id._id", name: "$_id.name", bought: {$arrayToObject: "$b"}}}
])
{ "_id" : ObjectId("5a102b0b49b317e3f8d6268c"), "name" : "andy", "bought" : { "fan" : "closing" } }
{ "_id" : ObjectId("5a102b0b49b317e3f8d6268b"), "name" : "tony", "bought" : { "notebook" : "running", "cellphone" : "repairing" } }

Я думаю, что это можно сделать проще, но я не знаю, как (и был бы рад узнать).

18.11.2017
  • Спасибо! Это полезно для меня. И я также хочу знать более простой ответ. 18.11.2017
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

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

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]