Dynami c от в $ lookup - PullRequest
       33

Dynami c от в $ lookup

1 голос
/ 11 марта 2020

Я пытаюсь выяснить, могу ли я изменить с в $ lookup или изменить порядок моего запроса, чтобы каким-то образом извлечь из трех потенциальных коллекций. Пока мне удалось настроить запрос следующим образом:

const search = db.collection("search");

search.aggregate([
  {
    '$match': {
      'id_int': 0
    }
  }, {
    '$project': {
      '_id': 0, 
      'collection': 1, 
      'id_int': 1
    }
  }, {
    '$lookup': {
      'from': 'arxiv', 
      'localField': 'id_int', 
      'foreignField': 'id_int', 
      'as': 'arxiv'
    }
  }
], function(err, cursor) ... )

$ match , а затем $ project этапы конвейера возвращают результат со следующими свойствами :

collection:"arxiv"
id_int:0 

Значение коллекции всегда будет одним из трех arxiv, crossref или pmc_test. Поэтому я хотел бы, чтобы мой $ lookup из использовал это значение свойства программно, а не жестко его кодировал.

'$lookup': {
   'from': 'arxiv' or 'crossref' or 'pmc_test', // Dynamic based on result
   ...
}

Спасибо

Редактировать

id_int будет передано, а коллекция - нет, поэтому в коллекцию поиска делается запрос.

1 Ответ

1 голос
/ 12 марта 2020

К сожалению, в настоящее время это невозможно, есть запрос на открытую функцию здесь , поэтому вы можете отслеживать его, если вы будете sh.

. два варианта.

  1. Разделите ваш вызов на 2 запроса и добавьте этот бит логики c в свой код, что я лично рекомендую.

  2. Используйте этот агрегат, который просматривает все 3 коллекции:

search.aggregate([
    {
        '$match': {
            'id_int': 0
        }
    },
    {
        '$project': {
            '_id': 0,
            'collection': 1,
            'id_int': 1
        }
    },
    {
        "$facet": {
            "arxiv": [
                {
                    "$lookup": {
                        "from": "arxiv",
                        "localField": "id_int",
                        "foreignField": "id_int",
                        "as": "arxiv"
                    }
                }
            ],
            "crossref": [
                {
                    "$lookup": {
                        "from": "crossref",
                        "localField": "id_int",
                        "foreignField": "id_int",
                        "as": "crossref"
                    }
                }
            ],
            "pmc_test": [
                {
                    "$lookup": {
                        "from": "pmc_test",
                        "localField": "id_int",
                        "foreignField": "id_int",
                        "as": "pmc_test"
                    }
                }
            ]
        }
    },
    {
        "$addFields": {
            "newRoot": [
                {
                    "k": "$collection",
                    "v": {
                        "$cond": [
                            {
                                "$eq": [
                                    "$collection",
                                    "arxiv"
                                ]
                            },
                            "$arxiv",
                            {
                                "$cond": [
                                    {
                                        "$eq": [
                                            "$collection",
                                            "crossref"
                                        ]
                                    },
                                    "$crossref",
                                    "$pmc_test"
                                ]
                            }
                        ]
                    }
                },
                {
                    "k": "collection", "v": "$collection"
                },
                {
                    "k": "id_int", "v": "$id_int"
                }
            ]
        }
    },
    {
        "$replaceRoot": {
            "newRoot": {
                "$arrayToObject": {
                    "$concatArrays": "$newRoot"
                }
            }
        }
    }
])

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...