mongodb - агрегирование и раскрутка иностранных документов

1

Итак, для моей базы данных в базе данных:

db.lists.insertMany([
    { _id: "1", name: "list1", included_lists: ["2"], items: ["i1"] },
    { _id: "2", name: "list2", included_lists: [], items: ["i2", "i3"] }
])


db.items.insertMany([
    { _id: "i1", name: "item1", details: [{}, {}, {}] },
    { _id: "i2", name: "item2", details: [{}, {}, {}] },
    { _id: "i3", name: "item3", details: [{}, {}, {}] }
])

В настоящее время я получаю данные своих предметов через:

db.lists.aggregate([
    { "$match": { "_id": { "$in": ["1", "2"] } } },
    {
        "$lookup": {
            "from": "items",
            "localField": "items",
            "foreignField": "_id",
            "as": "item"
        }
    },
    { "$unwind": "$item" },
    {
        "$facet": {
            "results": [
                { "$skip": 0 },
                { "$limit": 10 },
                {
                    "$project": {
                        name: 1,
                        item: 1
                    }
                }
            ],
            "total": [
                { "$count": "total" },
            ]
        }
    }
]).pretty()

который возвращает:

{
    "results" : [
        {
            "_id" : "1",
            "name" : "list1",
            "item" : {
                "_id" : "i1",
                "name" : "item1",
                "details" : [
                    {

                    },
                    {

                    },
                    {

                    }
                ]
            }
        },
        {
            "_id" : "2",
            "name" : "list2",
            "item" : {
                "_id" : "i2",
                "name" : "item2",
                "details" : [
                    {

                    },
                    {

                    },
                    {

                    }
                ]
            }
        },
        {
            "_id" : "2",
            "name" : "list2",
            "item" : {
                "_id" : "i3",
                "name" : "item3",
                "details" : [
                    {

                    },
                    {

                    },
                    {

                    }
                ]
            }
        }
    ],
    "total" : [
        {
            "total" : 3
        }
    ]
}

То, что я пытаюсь сделать, - удалить { "$match": { "_id": { "$in": ["1", "2"] } } }, как я хочу удалить запрос, необходимый для получить массив идентификаторов, и вместо того, чтобы просто получить все идентификаторы из списка _id и его included_lists идентификаторов. Затем верните все items как мой результат.

Этот вопрос похож на: mongodb - разматывание вложенных поддокументов, но я заново объяснялся из-за двусмысленности и отсутствия документов db.

  • 0
    зачем нужен включенный список, если вы все равно хотите просмотреть все документы списка? Похоже, вы просто не согласны
  • 0
    @AmitWagner Я не хочу бегать по всему списку документов. Я хочу только то, что находится в желаемом списке _id и все, что также есть в included_lists . Поэтому, если бы я выбрал целевой список "2" , я бы вернул максимум 2 результата.
Показать ещё 1 комментарий
Теги:
mongoose

1 ответ

1
Лучший ответ

вы можете сделать это с помощью поиска графа, а затем группы

db.lists.aggregate([
    { "$match": { "_id": { "$in": ["1"] } } },
    {
      $graphLookup: {
      from: "lists",
      startWith: "$_id" ,
      connectFromField: "included_lists",
      connectToField: "_id",
      as: "connected",
   }
        },
  
    {$unwind:"$connected"},
    { $group:{_id:"$connected._id",items:{$first:'$connected.items'},name:{$first:'$connected.name'}}},
     {
        "$lookup": {
            "from": "items",
            "localField": "items",
            "foreignField": "_id",
            "as": "item"
        }
    },
    { "$unwind": "$item" },
    {
        "$facet": {
            "results": [
                { "$skip": 0 },
                { "$limit": 10 },
                {
                    "$project": {
                        name: 1,
                        item: 1
                    }
                }
            ],
            "total": [
                { "$count": "total" },
            ]
        }
    }
    
    

   
]).pretty()
  • 0
    Если я хочу добавить оператор $match для раскрученных items , где я должен его поместить?
  • 0
    Ах, добавил его после $unwind

Ещё вопросы

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