Исключить вложенные поля и проектировать только несколько полей - PullRequest
0 голосов
/ 24 мая 2018

В этом фрагменте JSON я хочу получить только 3 поля _id.RULES.1.0._Rules.stringValue, _id.MYOPERATION и _id.CURRENTSTATE

{
  "_id" : {
  "RULES" : [
    { 
      "@class" : "a.b.c.Rules",
      "_Rules" : {
        "@class" : "a.b.c.RulesType",
        "type" : 2,
        "stringValue" : "Y_RULES"
      }
    }
  ],
  "MYOPERATION" : 1,
  "CURRENTSTATE" : "PROPOSED"
  }
}

Я пробовал следующее для https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/

db.results.find(
  {},
  {
    "_id.CURRENTSTATE":1, 
    "_id.RULES.1.0._Rules.stringValue":1,
    "_id.CURRENTSTATE":1
  }
)

Результаты, которые я получаю, похожи на db.results.find();

Любые мысли или идеи приветствуются.

1 Ответ

0 голосов
/ 24 мая 2018

На самом деле вы не можете выбирать поля из встроенного содержимого и, в частности, из такого массива.Если вам нужен этот уровень манипуляции, вам нужно использовать aggregate() и $project:

db.results.aggregate([
  { "$project": {
     "_id": {
       "MYOPERATION": 1,
       "CURRENTSTATE": 1,
       "RULES": {
         "$arrayElemAt": [
           { "$map": {
             "input": "$_id.RULES",
             "in": {
               "_Rules": { 
                 "stringValue": "$$this._Rules.stringValue"
               } 
             }
           }},
           0
         ]
       }
     }
  }}
])

. Это вернет полный путь для первого индекса массива:

{
    "_id" : {
        "MYOPERATION": 1,
        "CURRENTSTATE" : "PROPOSED",
        "RULES" : {
            "_Rules" : {
                    "stringValue" : "Y_RULES"
            }
        }
    }
}

В качестве альтернативы, если вы просто хотите «значение» указанного ключа, вы можете сделать:

db.results.aggregate([
  { "$project": {
    "_id": {
      "MYOPERATION": 1,
      "CURRENTSTATE": 1,
      "stringValue": {
        "$arrayElemAt": [
          "$_id.RULES._Rules.stringValue",
          0
        ]
      }
    }
  }}
])

, который просто возвращает это значение:

{
  "_id" : { 
    "MYOPERATION": 1,
    "CURRENTSTATE" : "PROPOSED", 
    "stringValue" : "Y_RULES"
  }
}

В любомВ этом случае $arrayElemAt вы хотите вернуть значение из определенного индекса массива, а не «индексную нотацию» для этого типа данных.Вы хотите $map везде, где вам нужно преобразовать контент в массиве

Также есть:

db.results.aggregate([
  { "$project": {
    "_id": 0,
    "MYOPERATION": "$_id.MYOPERATION",
    "CURRENTSTATE": "$_id.CURRENTSTATE",
    "RULES._Rules.stringValue": "$_id.RULES._Rules.stringValue"
  }}
])

Но это, вероятно, не возвращает того, что вы на самом деле хотитепоскольку запись массива становится «инвертированной» для фактических конечных значений:

{
    "MYOPERATION": 1,
    "CURRENTSTATE" : "PROPOSED",
    "RULES" : {
        "_Rules" : {
                "stringValue" : [
                        "Y_RULES"
                ]
        }
    }
}

Независимо от того, к какому конечному результату вы стремитесь, скорее всего, будет задействована некоторая комбинация $arrayElemAtи, возможно, $map методы, чтобы получить результаты, которые вы на самом деле хотите.

Также обратите внимание, что _id на самом деле не выглядит хорошим местом для хранения всей этой информации и выглядит болеескорее ошибка, чем намеренная.Структура имеет очень «XML» «ощущение», как если бы она была преобразована из исходного кода.Если это так, то вам лучше посмотреть на этот процесс преобразования и на самом деле «изменить» вывод, прежде чем он будет вставлен в MongoDB.

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