Мангуста использует $ in и обновляет только одну с последней отметкой времени - PullRequest
0 голосов
/ 09 июня 2018

Не уверен, если это возможно, но у меня есть несколько documents в коллекции.В documents есть дубликаты, и единственное отличие - timestamp

, например:

{
    name: 'abc',
    verified: false,
    createdAt: 'timestamp1'
},
{
    name: 'abc',
    verified: false,
    createdAt: 'timestamp2'
},
{
    name: 'abc',
    verified: false,
    createdAt: 'timestamp3'
    },
{
    name: 'eee',
    verified: false,
    createdAt: 'timestamp1'
},
{
    name: 'eee',
    verified: false,
    createdAt: 'timestamp2'
}

, как можно видеть, есть дубликаты для поля name, но я толькохочу обновить с самых последних timestamp, verified до true

Но timestamp действительно случайно поймать.

Я могу использовать update and $in, но это будетобновить все документы, а не только тот, который содержит самую последнюю timestamp

выборку отметки времени, созданную mongoose

},
"updatedAt": {
    "$date": "2018-06-08T23:39:49.310Z"
},
"createdAt": {
    "$date": "2018-06-08T23:21:15.669Z"
},

. Это мой простой код, использующий $in

const names = ['abc', 'eee'];

Model.update({
        'name': {
            $in: names
        }
    }, { verified: true }, { multi: true });

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 09 июня 2018

Найти самые последние документы по createdAt для указанных имен:

const names = ['abc', 'eee'];

collection.aggregate(
[
   {$match: {'name': {$in: names}}},
   {$group: {_id: '$name', createdAt: {$max: '$createdAt'}}},
]);

Сохранить результат запроса в переменной result как Array или cursor.

Затем вы можете обновить документы:

results.forEach((newestDocumentForName) => collection.update({_id: newestDocumentForName['_id']}, {/*your set operation*/});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...