Обновление во вложенном массиве на основе запросов Date может работать некорректно (или, возможно, я что-то не так делаю ..) - PullRequest
2 голосов
/ 30 мая 2019

Создайте коллекцию «тест» и вставьте в нее один документ:

   {
    "_id" : NumberLong(1),
    "pointsBalances" : [ 
        {
            "period" : "2020",
            "startDate" : ISODate("2020-01-01T00:00:00.000Z"),
            "endDate" : ISODate("2020-12-31T23:59:59.999Z"),
            "value" : 0
        }, 
        {
            "period" : "2019",
            "startDate" : ISODate("2019-01-01T00:00:00.000Z"),
            "endDate" : ISODate("2019-12-31T23:59:59.999Z"),
            "value" : 0
        }
    ]
}

Затем выполните обновление - оно должно работать правильно:

db.getCollection('test').update(
  {$and: [ {'_id': 1}, {"pointsBalances.period": '2019'}]},
  {$set: { "pointsBalances.$.value": 100 } }
)

Теперь попробуем обновить по датам:

   db.getCollection('test').update(
{ $and: [
    {'_id': 1},
    {"pointsBalances.startDate": {$lte: ISODate("2019-05-01T00:00:00.000Z")}},
    {"pointsBalances.endDate": {$gte: ISODate("2019-05-01T00:00:00.000Z")}}
  ]},
{$set: { "pointsBalances.$.value": 200 } })

Похоже, что неправильный элемент обновлен

1 Ответ

1 голос
/ 30 мая 2019

MongoDB обновляет первый соответствующий документ для условия, попробуйте elemMatch

 db.michel.update(
{ $and: [
    {'_id': 1},
    {"pointsBalances" : { 
        "$elemMatch" : { $and: [

                    {"startDate": {$lte: ISODate("2019-05-01T00:00:00.000Z")}},
                    {"endDate": {$gte: ISODate("2019-05-01T00:00:00.000Z")}}

                            ]}}}]},
{$set: { "pointsBalances.$.value": 200 } });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...