MongoDB, как сохранить конкретные элементы массива или «ссылаться» на элемент? - PullRequest
0 голосов
/ 28 ноября 2018

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

    {
        "_id" : ObjectId("abc123"),
        "notreallyusedfields" : "dontcare",
        "data" : [
                {
                        "value" : "Demian",
                        "otherSomtimesInterestingFields": 1
                        "type" : title,
                },
                {
                        "value" : "200",
                        "otherSometimesInterestingFields": 1
                        "type" : length,
                },
                {
                        "value" : "Hesse",
                        "otherSometimesInterestingFields": 1
                        "type" : author,
                },
                many others
        ]
}

Я хотел бы сохранить элементы массива данных (основанные на "типе")или как-то ссылаться на них, но я не знаю как.Не каждый массив данных имеет элементы одного типа (иногда, например, отсутствует автор и т. Д.).Если бы это было так, и порядок гарантирован, я мог бы использовать оператор arrayElementAt следующим образом:

$project:
  {

     title: { $arrayElemAt: [ "$data", 0 ] },
     length: { $arrayElemAt: [ "$data", 1 ] },
     author: { $arrayElemAt: [ "$data", 2 ] },

  }

Как вы могли бы сделать что-то подобное с данной структурой?

Мне это нужно, потому чтоУ меня есть структура, в основном поля внутри массива данных для данной схемы, и я не могу по-настоящему использовать объединение или группировку, где я не могу сказать, какое «поле» (какой элемент массива данных) нужно сгруппировать или объединитьот.Вот почему я думаю, что нужный элемент должен быть как-то «сохранен» с именем, чтобы я мог ссылаться на них.

Я могу обойти проблему, используя java и выполняя там все (как я это делал сприсоединиться к проблеме), но становится все хуже, если я продолжу решать эти проблемы в JAVA вместо mongoDB.

Есть идеи?Спасибо!

1 Ответ

0 голосов
/ 28 ноября 2018

Вы можете использовать $filter агрегацию, чтобы найти конкретный type внутри массива data, а затем можете использовать $arrayELemAt с отфильтрованным массивом

db.collection.aggregate([
  { "$project": {
    "title": {
      "$arrayElemAt": [
        { "$filter": { "input": "$data", "cond": { "$eq": ["$$this.type", "title"] }}},
        0
      ]
    },
    "length": {
      "$arrayElemAt": [
        { "$filter": { "input": "$data", "cond": { "$eq": ["$$this.type", "length"] }}},
        0
      ]
    },
    "author": {
      "$arrayElemAt": [
        { "$filter": { "input": "$data", "cond": { "$eq": ["$$this.type", "author"] }}},
        0
      ]
    }
  }}
])
...