На самом деле вы не можете выбирать поля из встроенного содержимого и, в частности, из такого массива.Если вам нужен этот уровень манипуляции, вам нужно использовать 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.