Javascript 在mongo集合上运行并将数组字段更改为不同的
我在mongodb中有一个集合,这个集合有一个名为“errors”的字段,它是一个数组 这个数组推送了错误的分配,我想区分它。例如: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-
"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"} }}
]);
在“区分”它时,你是想取最早的“何时”,最晚的“何时”,还是所有的“何时”?另外:您实际上是想更新数据还是只是查询数据?该管道不会产生结果。