Пн goose обновления: увеличить счетчик и сбросить до 0 на новую дату - PullRequest
1 голос
/ 04 мая 2020

У меня есть схема, которая выглядит следующим образом:

var Counter = new Schema ({
 _id: ObjectId,
 date: Date,
 counter: Number
})

По запросу я отправляю дату дня и ожидаю добавления даты и увеличения счетчика. Теперь, когда я добавляю счетчик увеличивается ie 1,2,3 и c и добавляется дата.

Теперь возникает проблема: Я хочу счетчик для сбросить до 0, когда задается другая дата (например, каждый новый день счетчик должен начинаться с 0), а затем снова начать увеличение счетчика и т. д. c ...

Это мой код о том, как я пытался:

Counter.findOneAndUpdate(
  { 
   $set:{
     "date: thedate",
   },
   $inc: {
     "counter: counter+1"
    }
)

Как мне этого добиться?

ОБНОВЛЕНИЕ ДЛЯ БОЛЬШЕ УТОЧНЕНИЯ

Возьмите этот пример двух документов

{ 
  "_id": ObjectId("1111"), 
  "date": "2020-04-13", 
  "counter": 0, 
}

{ 
  "_id": ObjectId("2222"), 
  "date": "2020-04-29", 
  "counter": 0, 
}

В моей коллекции более одного документа. Я хочу обновить документ на основе его идентификатора. Для этого случая я хочу обновить 1-й документ с идентификатором 1111

Теперь, если указать дату ввода, скажем, 2020-04-13 и идентификатор «1111», который соответствует первому документу, он должен увеличить сноску до 1. Если я снова даю ту же дату (с тем же идентификатором 111), счетчик должен увеличиться до 2.

Если я снова введу дату ввода 2020-04-14 (это другая дата) в том же первом документе с идентификатором 1111 он должен сбросить счетчик на 0.

Теперь, как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Поскольку вы можете выполнить обновление с агрегационным конвейером в .update() операциях, начиная с версии MongoDB> = 4.2, попробуйте выполнить запрос ниже ie:

Counter.findOneAndUpdate(
    { _id: ObjectId("............") }, // filter query - Input of type ObjectId()
    /** Update date field with input & re-create 'counter' field based on condition */
    [{
      $addFields: {
        date: inputDate, // Input type of date, In general Date is saved in MongoDB as ISODate("2020-05-06T00:00:00.000Z")
        counter: { $cond: [ { $eq: [ "$date", inputDate ] }, { $add: [ "$counter", 1 ] }, 0 ] }
      }
    }]
  )

Тест: Тест агрегации конвейера здесь: mongoplayground

0 голосов
/ 04 мая 2020

Мне все еще не ясно, чего вы хотите достичь, но вы можете попробовать этот метод, взломав поиск и обновление

Counter.findOne({})  //match inside {} condition
.then(counter => {
   if(counter.date){ //apply date condition here
      counter.counter+=1;
      } else {
       counter.counter = 0;
      }
  counter.save()
   .then(updatedCounter => {
     // further action you want to take
   })
})
.catch(err => {
 //handle err here
})
...