mongodb: вытащить элемент из вложенного массива, где дата раньше - PullRequest
0 голосов
/ 22 октября 2019

У меня проблема, которая считается такой простой. Даны вложенные документы, которые имеют поле expires. Один пример документа:

{
   _id: ObjectId(),
   stuff: [
     {
        name: 'egg',
        expires: ISODate("2019-07-19T12:52:56.163Z")
     },
     {
        name: 'potato',
        expires: ISODate("2019-07-19T12:52:56.163Z")
     }
   ]
}

Я подумал, что мог бы использовать такой запрос:

db.collection.update({"_id": ObjectId("578411d30af77c226c52b940")}, { 
  "$pull": { 
    "stuff.expires": { "$lt": ISODate() } 
  } 
});

, возможно, с возможностью применить его к нескольким документам одновременно, но даже при попытке обновленияодин документ, с которым я столкнулся с этой ошибкой:

Невозможно использовать часть (expires) (stuff.expires) для прохождения элемента

Я перепробовал массу изменений, но я не смог найти способ сделать эту работу или подобный пример (который кажется довольно странным при поиске mongodb).

Если нет способа обновить несколько документов одновременно,Я был бы счастлив, если бы был способ удалить все просроченные элементы из одного документа в атомарном запросе. Запрос не должен работать со старыми версиями mongodb - последняя версия в порядке.

1 Ответ

1 голос
/ 22 октября 2019

Я думаю, что вы можете достичь желаемого с помощью этого запроса:

db.collection.update({}, {
    $pull: {
        stuff: {
            expires: {
                $lt: ISODate()
            }
        }
    }
}, {
    multi: true
})

Приведенный выше запрос будет нацелен на все документы и будет извлекать каждый stuff объект, срок действия которого ниже, чем у вашего ISODate()multi:true - опция, позволяющая обновить несколько документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...