mongoose使用$ in并且只更新一个最近的时间戳

时间:2018-06-09 18:53:26

标签: javascript database mongodb mongoose

不确定这是否可行,但是, 我在集合中只有documentsdocuments中有重复项,唯一的区别是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字段有重复项,但我只想更新最近的timestampverifiedtrue

但是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 :(得分:2)

createdAt查找指定名称的最新文档:

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

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

将查询结果保存在resultArray变量cursor中。

然后你可以更新文件:

results.forEach((newestDocumentForName) => collection.update({_id: newestDocumentForName['_id']}, {/*your set operation*/});