Обновление mongodb / mongoose arrayFilters (с $ []) не работает

Мое обновление с использованием $ [] отказывается работать. Схема:

tables: {
    type: [
        {
            tableID: String,
            numberOfChairs: Number,
            reserved: Boolean,
            location: String,
            inDoors: Boolean,
            reservedDuring: [
                {
                    reservedFrom: Date,
                    reservedTo: Date,
                    reservedFor: {
                        type: mongoose.Schema.Types.ObjectId,
                        ref: 'Consumer'
                    }
                }
            ]
        }
    ],
    required: false
},

Моя функция обновления:

TableBooking.updateMany({}, {
    '$set': {
        'tables.$[].reservedDuring.$[arr].reservedFrom': Date.now()
    }
}, { arrayFilters: [{
        'arr.reservedFrom': { $gte: Date.now() }
    }],
    multi: true
}, ).then(function (doc)){}

Моя функция обновления продолжает возвращать "{" n ": 2," nModified ": 0," ok ": 1}". Понятия не имею, почему функция отказывается обновлять элемент массива. У меня есть 2 документа, в которых условие arrayfliters выполнено, но ничего не изменилось. Я использую MongoDB 4.0 и mongoose 5.2.14 и @ types / mongoose: 5.2.12 (я пишу свое приложение в TS).

Невозможно проверить прямо сейчас, но вы думаете, что вы пропустили поле 'type' - это ваш $ set: 'tables.type. $ []. ReservedDuring ...

matthPen 02.10.2018 13:05

@matthPen Я никогда не видел, чтобы поле типа использовалось таким образом. Как бы то ни было, я пробовал использовать все мыслимые единственные комбинации и каждый раз получал "{" ok ": 0," n ": 0," nModified ": 0}". Я полагаю, что mongodb искал поля с именем «тип».

JugisPOM 02.10.2018 13:15

Но у вас ЕСТЬ поле с именем type! Согласно вашей схеме, таблицы - это не массив, а table.type - один. Я не говорю о типе поля

matthPen 02.10.2018 13:21

Извините, я сначала вас неправильно понял. Но разве результат моей первоначальной реализации не должен быть "{" ok ": 0," n ": 0," nModified ": 0}" ?? В любом случае я немного поэкспериментирую. Благодарю.

JugisPOM 02.10.2018 13:39

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

matthPen 02.10.2018 13:42

Хорошо, я попытался удалить поле "type" и оставил там только массив, но получил тот же результат: {"n": 2, "nModified": 0, "ok": 1}: /

JugisPOM 02.10.2018 13:42

let tableBooking = new TableBooking (); tableBooking.save (). then (() => {let reservationArray = {tableID: theTables.tableID, numberOfChairs: theTables.numberOfChairs, зарезервировано: theTables.reserved, location: theTables.location, inDoors: theTables.inDoors, Зарезервировано во время: theTables .reservations}; tblBooking.markModified ('таблицы'); TableBooking.findByIdAndUpdate (tblBooking._id, {'$ push': {'tables' :servationsArray}}, (err, model) => {});

JugisPOM 02.10.2018 13:48

Это была функция, которую я использую, но я рекомендую просто создать макет в MongoDB Compass.

JugisPOM 02.10.2018 13:49

:) Когда я сказал образец данных, я имел в виду данные json из mongodb, а не функцию, которую вы использовали для сохранения своих данных!

matthPen 02.10.2018 13:52

pastebin dott comm / H0SX0MSX <- Здесь вы можете найти JSON

JugisPOM 02.10.2018 13:59

Хорошо @matthPen Мне ответили с решением. Часть "типы", которую вы изначально упомянули, не имела отношения к делу, это не другое поле, это просто тип. РЕШЕНИЕ: github.com/Automattic/mongoose/issues/7079

JugisPOM 02.10.2018 14:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
11
1 186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

хорошо, я понимаю: вы говорите о формате даты в своей схеме, но на самом деле вы храните поля (зарезервированныеFrom и reservedTo) как String. Таким образом, ваш arrayFilters не соответствует хорошим результатам. Более того, Date.now () вернет метку времени, а не строковое представление даты или ISODate. Мой совет - работать с ISODate вместо String, потому что им легче манипулировать. Вот код для достижения желаемого:

db['TableBooking'].updateMany({}, {
    '$set': {
        'tables.$[].reservedDuring.$[arr].reservedFrom': new ISODate()
    }
}, { arrayFilters: [{
        'arr.reservedFrom': { $gte: new ISODate().toISOString() }
    }],
    multi: true
} )

Если вы все еще хотите работать со строкой вместо дат, вам нужно немного изменить это, добавив .toISOString () в новый ISODATE () на этапе $ set (точно так же, как в arrayFilters)

Другие вопросы по теме