Учитывая, что у меня есть следующая коллекция (игнорируя документы _id
):
Коллекция
[
{
"Id": "1",
"Level2": [
{
"Id": "1.1",
"Level3": [
{
"Id": "1.1.1",
"Level3_4": {
"Transport": "Car",
"Level4": [
{
"Id": "1.1.1.1",
"Status": "run",
"Direction": "N"
},
{
"Id": "1.1.1.2",
"Status": "run",
"Direction": "S"
},
{
"Id": "1.1.1.3",
"Status": "pause",
"Direction": "S"
},
{
"Id": "1.1.1.4",
"Status": "run",
"Direction": "W"
}
]
}
},
{
"Id": "1.1.2",
"Level3_4": {
"Transport": "Bus",
"Level4": [
{
"Id": "1.1.2.1",
"Status": "run",
"Direction": "S"
},
{
"Id": "1.1.2.2",
"Status": "stop",
"Direction": "N"
},
{
"Id": "1.1.2.3",
"Status": "stop",
"Direction": "W"
},
{
"Id": "1.1.2.4",
"Status": "run",
"Direction": "E"
}
]
}
}
]
},
{
"Id": "1.2",
"Level3": [
{
"Id": "1.2.1",
"Level3_4": {
"Transport": "Train",
"Level4": [
{
"Id": "1.2.1.1",
"Status": "run",
"Direction": "N"
}
]
}
},
{
"Id": "1.2.2",
"Level3_4": {
"Transport": "Bus",
"Level4": []
}
}
]
}
]
}
]
Обновление
Я хочу обновить все документы в коллекции, такие как:
Level2.Level3.Level3_4.Level4.Status: "pause"
Использование updateOne
и без upsert
Все Level4
, которые соответствуют следующим условиям
Условия
где:
Level2.Level3.Id $in ["1.1.1","1.1.2"]
И Level2.Level3.Level3_4.Level4.Status $in ["run", "stop"]
И Level2.Level3.Level3_4.Level4.Direction $in ["N", "S"]
РЕЗУЛЬТАТ
Результат должен быть таким:
[
{
"Id": "1",
"Level2": [
{
"Id": "1.1",
"Level3": [
{
"Id": "1.1.1",
"Level3_4": {
"Transport": "Car",
"Level4": [
{
"Id": "1.1.1.1",
"Status": "pause",
"Direction": "N"
},
{
"Id": "1.1.1.2",
"Status": "pause",
"Direction": "S"
},
{
"Id": "1.1.1.3",
"Status": "pause",
"Direction": "S"
},
{
"Id": "1.1.1.4",
"Status": "run",
"Direction": "W"
}
]
}
},
{
"Id": "1.1.2",
"Level3_4": {
"Transport": "Bus",
"Level4": [
{
"Id": "1.1.2.1",
"Status": "pause",
"Direction": "S"
},
{
"Id": "1.1.2.2",
"Status": "pause",
"Direction": "N"
},
{
"Id": "1.1.2.3",
"Status": "stop",
"Direction": "W"
},
{
"Id": "1.1.2.4",
"Status": "run",
"Direction": "E"
}
]
}
}
]
} ...
]
}
]
Я борюсь с оператором $set
и arrayFilters
. Как я могу выполнить sh это?
Вот куда я зашел:
db.test.update({},
{
$set: {
"Level2.$[level2].Level3.$[level3].Level3_4.Level4.$[level4].Status": "pause"
}
},
{
arrayFilters: [
{
"level3.Id": {
$in: [
"1.1.1",
"1.1.2"
]
}
},
{
"level4.Status": {
$in: [
"run",
"stop"
]
}
},
{
"level4.Direction": {
$in: [
"N",
"S"
]
}
}
]
}
)
Однако это не работает ... Что я делаю не так?