Javascript 在mongo集合上运行并将数组字段更改为不同的

Javascript 在mongo集合上运行并将数组字段更改为不同的,javascript,arrays,mongodb,Javascript,Arrays,Mongodb,我在mongodb中有一个集合,这个集合有一个名为“errors”的字段,它是一个数组 这个数组推送了错误的分配,我想区分它。例如: "errors" : [ { "when" : ISODate("2018-02-06T18:23:42.315Z"), "err" : "No document existing" }, { "when" : ISODate("2018-02-

我在mongodb中有一个集合,这个集合有一个名为“errors”的字段,它是一个数组

这个数组推送了错误的分配,我想区分它。例如:

"errors" : [
        {
            "when" : ISODate("2018-02-06T18:23:42.315Z"),
            "err" : "No document existing"
        },
        {
            "when" : ISODate("2018-02-06T18:53:48.396Z"),
            "err" : "No document existing"
        },
        {
            "when" : ISODate("2018-02-06T19:23:50.118Z"),
            "err" : "No document existing"
        },
        {
            "when" : ISODate("2018-02-06T19:53:52.205Z"),
            "err" : "Conversion Error - ABC"
        },
        {
            "when" : ISODate("2018-02-06T20:23:53.838Z"),
            "err" : "Conversion Error - ABC"
        },
        {
            "when" : ISODate("2018-02-06T20:53:55.615Z"),
            "err" : "Conversion Error - DFL"
        },
        {
            "when" : ISODate("2018-02-06T21:23:57.826Z"),
            "err" : "Conversion Error - DFL"
        },
        {
            "when" : ISODate("2018-02-06T22:54:07.410Z"),
            "err" : "Conversion Error - DFL"
        }
    ]
上面您可以看到某些文档的错误数组,我希望它:

"errors" : [
        {
            "when" : ISODate("2018-02-06T18:23:42.315Z"),
            "err" : "No document existing"
        }
        {
            "when" : ISODate("2018-02-06T20:23:53.838Z"),
            "err" : "Conversion Error - ABC"
        }
        {
            "when" : ISODate("2018-02-06T22:54:07.410Z"),
            "err" : "Conversion Error - DFL"
        }
    ]
因此,我想运行一个脚本来实现这一点,因此我提出了如下建议:

db.myCollection.find({}).forEach(it => {

    var errs = new Set(it.errors.map(x => x.err))

    db. myCollection.findOneAndUpdate({_id: it._id}, {$set: {errors: errs}})

});
但是这样我就失去了我的“when”…另一个挑战是真正的错误数组要大得多,里面甚至可以有50K个元素

这个问题有什么解决办法吗


谢谢

您可以使用聚合

db.myCollection.aggregate([{
$group: {
    _id: '$err',
    "when": {
        $first: "$when"
    },
    "err": {
        $first: "$err"
    }
}
}])
这将为您提供按错误分组的不同的文档

尝试以下操作:

db.foo.aggregate([
{$unwind: "$errors"},
{$group: {_id: "$errors.err", when: {$FUNC: "$errors.when"} }}
   ]);
其中
FUNC
可以是
first
last
,或
push
<代码>推送将在时为您提供所有的
。注意:
first
last
将在错误数组已排序的情况下执行预期操作。如果没有,则必须按以下顺序排序:

db.foo.aggregate([
{$unwind: "$errors"},
{$sort: {"errors.when":1} },
{$group: {_id: "$errors.err", when: {$FUNC: "$errors.when"} }}
   ]);

在“区分”它时,你是想取最早的“何时”,最晚的“何时”,还是所有的“何时”?另外:您实际上是想更新数据还是只是查询数据?该管道不会产生结果。