Мое обновление с использованием $ [] отказывается работать. Схема:
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).
@matthPen Я никогда не видел, чтобы поле типа использовалось таким образом. Как бы то ни было, я пробовал использовать все мыслимые единственные комбинации и каждый раз получал "{" ok ": 0," n ": 0," nModified ": 0}". Я полагаю, что mongodb искал поля с именем «тип».
Но у вас ЕСТЬ поле с именем type! Согласно вашей схеме, таблицы - это не массив, а table.type - один. Я не говорю о типе поля
Извините, я сначала вас неправильно понял. Но разве результат моей первоначальной реализации не должен быть "{" ok ": 0," n ": 0," nModified ": 0}" ?? В любом случае я немного поэкспериментирую. Благодарю.
предоставить образцы данных, я могу попробовать на своей стороне. Никогда не тестировал одновременно $ [] и $ [placeholder].
Хорошо, я попытался удалить поле "type" и оставил там только массив, но получил тот же результат: {"n": 2, "nModified": 0, "ok": 1}: /
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) => {});
Это была функция, которую я использую, но я рекомендую просто создать макет в MongoDB Compass.
:) Когда я сказал образец данных, я имел в виду данные json из mongodb, а не функцию, которую вы использовали для сохранения своих данных!
pastebin dott comm / H0SX0MSX <- Здесь вы можете найти JSON
Хорошо @matthPen Мне ответили с решением. Часть "типы", которую вы изначально упомянули, не имела отношения к делу, это не другое поле, это просто тип. РЕШЕНИЕ: github.com/Automattic/mongoose/issues/7079





хорошо, я понимаю: вы говорите о формате даты в своей схеме, но на самом деле вы храните поля (зарезервированные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)
Невозможно проверить прямо сейчас, но вы думаете, что вы пропустили поле 'type' - это ваш $ set: 'tables.type. $ []. ReservedDuring ...