как запросить в mongodb с l oop в той же коллекции, пока я не найду нулевое или пустое значение? - PullRequest
2 голосов
/ 14 июля 2020

Я сложил во вложенный объект. вот моя коллекция.

{
"key": 1,
"subKey": ""
},
{
"key": 2,
"subKey": 1
},
{
"key": 3,
"subKey": 2
},
{
 "key": 4,
 "subKey": 3
}

Я хочу запросить Key:4, что дает мне результат

{
 "key": 4,
 "subKey": 3
}

после получения результата я хочу запросить "subKey": 3 как key:"$subKey" и я хочу запустить al oop, пока не найду пустой subKey, в нашем случае это Key:1. и всякий раз, когда я нахожу пустой subKey, я хочу, чтобы он был родительским.

В конце концов, мне нужен результат

{
 "key": 4,
 "parent":{"key":1,"subKey":"",....}
}

или аналогичный.

Это это возможно с помощью встроенной функции MongoDB? если он недоступен, как мне достичь этой цели?

также, мне нужно альтернативное решение, если оно есть.

1 Ответ

4 голосов
/ 14 июля 2020

Вы можете достичь, используя $graphLookup

play

db.collection.aggregate([
  {
    $graphLookup: {
      from: "collection",
      startWith: "$key", 
      connectFromField: "subKey",
      connectToField: "key",
      as: "keys"
    }
  }
])

Если вы хотите добавить фильтр совпадений,

play

db.collection.aggregate([
  {
    $match: {
      key: 4
    }
  },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$key",
      connectFromField: "subKey",
      connectToField: "key",
      as: "keys"
    }
  }
])

Важное замечание:

Этап $ graphLookup должен оставаться в пределах 100 МБ памяти. Если для операции aggregate () указано allowDiskUse: true, этап $ graphLookup игнорирует параметр

Для преобразования данных у вас не может быть повторяющихся ключей в объекте parent. Итак, parent должен быть массивом

play

db.collection.aggregate([
  {
    $match: {
      key: 4
    }
  },
  {
    $graphLookup: {
      from: "collection",
      startWith: "$key",
      connectFromField: "subKey",
      connectToField: "key",
      as: "keys"
    }
  },
  {
    "$addFields": {
      "parent": {
        "$map": {
          "input": "$keys",
          "as": "res",
          "in": {
            "key": "$$res.key",
            "subKey": "$$res.subKey"
          }
        }
      },
      "key": "$key",
      
    }
  },
  {
    $project: {
      keys: 0
    }
  }
])
...