Повторение списка в MongoDB

#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. Мне удалось устранить эту ошибку, но теперь у меня появилась новая проблема. Я работаю над обновлением вопроса, чтобы у вас было больше контекста.