#mongodb #mongodb-query
Вопрос:
Я полный новичок в MongoDB и изо дня в день пытаюсь удалить некоторые записи из коллекции. Мне приходится делать это изо дня в день, потому что коллекция огромна и время от времени уходит месяц за месяцем. Вот пример кода, который у меня есть:
days = ['2018-04-01-day','2018-04-02-day','2018-04-03-day','2018-04-04-day','2018-04-05-day','2018-04-06-day','2018-04-07-day','2018-04-08-day','2018-04-09-day','2018-04-10-day','2018-04-11-day','2018-04-12-day','2018-04-13-day','2018-04-14-day','2018-04-15-day','2018-04-16-day','2018-04-17-day','2018-04-18-day','2018-04-19-day','2018-04-20-day','2018-04-21-day','2018-04-22-day','2018-04-23-day','2018-04-24-day','2018-04-25-day','2018-04-26-day','2018-04-27-day','2018-04-28-day','2018-04-29-day','2018-04-30-day']
var day;
for(day of days)
{
print(day)
db.<colln>.remove
(
{ 'time_bucket': day },
{ 'URL':/https://abc.com/}
)
}
Приведенный выше код выполняется, но дает мне только следующее:
2018-04-06-day
WriteResult({ "nRemoved" : 0 })
Я ожидал бы, по крайней мере, увидеть все даты напечатанными, но даже этого не происходит.
Я пробовал другие методы, использующие методы даты UTC, и они, похоже, тоже не работали.
Я могу заставить следующий код работать с меньшей коллекцией:
db.<small colln>.remove(
{ 'time_bucket': '2018-04-month' },
{ 'URL':/https://abc.com/}
)
Но приведенный выше код (удаление по месяцам) не будет работать для большей коллекции, поэтому я вынужден делать это изо дня в день, создавая массив в течение нескольких дней. Я знаю, что это не самый эффективный метод, но мне все равно нужно заставить его работать.
Любая помощь была бы очень признательна.
Комментарии:
1. Можете ли вы опубликовать несколько примеров документов?
2. Вы никогда не должны хранить значения даты/времени в виде строки, это недостаток дизайна. Храните правильные
Date
объекты, оболочка mongo предоставляет встроенный псевдоним, напримерISODate("2018-01-01T00:00:00Z")
Ответ №1:
for(var day in days)
будет перебирать индексы вашего массива, производя
for(var day in days){ print (day) }
0
1
2
3
4
5
Я верю, что ты хотел использовать for(var day of days)
:
for(var day of days){ print (day) }
2018-04-01-day
2018-04-02-day
2018-04-03-day
2018-04-04-day
2018-04-05-day
2018-04-06-day
Просто хотел добавить еще несколько деталей. Я протестировал следующее на своем локальном MongoDB 4.2 в этой коллекции:
{ "_id" : ObjectId("6053e2f7acf8d9b7cc48adf0"), "name" : "test 4", "time_bucket" : "2018-04-03-day" }
{ "_id" : ObjectId("6053e4ccacf8d9b7cc48adf1"), "name" : "test", "time_bucket" : "2018-04-01-day" }
{ "_id" : ObjectId("6053e4d3acf8d9b7cc48adf2"), "name" : "test 1", "time_bucket" : "2018-04-01-day" }
{ "_id" : ObjectId("6053e4ddacf8d9b7cc48adf3"), "name" : "test 34", "time_bucket" : "2018-04-02-day" }
const days = ['2018-04-01-day','2018-04-02-day']
for(let day of days){ db.testcol.remove( { 'time_bucket': day }) }
После его выполнения коллекция выглядит следующим образом:
{ "_id" : ObjectId("6053e2f7acf8d9b7cc48adf0"), "name" : "test 4", "time_bucket" : "2018-04-03-day" }
Так что, похоже, все работает так, как задумано.
Комментарии:
1. Большое спасибо за ваш ответ, но я получаю эту ошибку даже после перехода
in
наof
:[js] ReferenceError: day is not defined :
2. Когда я выполняю ваш код выше, он выполняется правильно. Но когда у меня есть команда MongoDB
remove
, она дает мне[js] ReferenceError: day is not defined :
3. @Patthebug Какую версию mongodb вы используете?
4. Версия 4.2.2
5. Мне удалось устранить эту ошибку, но теперь у меня появилась новая проблема. Я работаю над обновлением вопроса, чтобы у вас было больше контекста.