如何更新和返回所有符合条件的数组元素



我尝试了以下操作,并理解$返回第一个匹配元素。

vardate=newDate();
date.setDate(date.getDate()-30);
db.getCollection('status').find({
'data.end_ts': {
'$lte': date
},
$or: [
{
"data.risk_status": 'inactive'
},
{
"data.risk_status": 'expired'
}
]
},
{
"data.$": 1
})

然后我计划删除projection,并在java中执行删除工作。

这里的问题是,我需要删除并插入到另一个集合中。因此,我不能只使用delete。

我想出了另一种方法来避免java中的条件。

db.getCollection('status').aggregate([
{
"$match": {
$or: [
{
"data.risk_status": 'inactive'
},
{
"data.risk_status": 'expired'
}
]
}
},
{
$unwind: "$data"
},
{
$match: {
'datas.end_ts': {
'$lte': date
}
}
},
{
$group:{
"_id":"$_id",
"a":{$push:"$$ROOT"}
}
},
{
$project:{
"_id":1,
"a.data":1
}
}
])
])

有没有其他方法可以删除和返回文档。这样我就可以将返回的文档保存到其他集合中。

我可以在这里使用$out吗?我不确定。任何减少网络往返时间的帮助都是可取的。

是的,当然可以使用$out来推送新集合。由于您需要将一些数据从一个集合添加到另一个集合,$out有助于有效地减少编程时间和代码。

Aggregation aggregation = Aggregation.newAggregation(
match(Criteria.where("data.risk_status").in("inactive","expired")),
unwind("$data"),
// all other stages
o->new Document("$out","NEW_COLLECTION_NAME")
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

注意:$out必须是聚合的最后阶段。参考$out。

最新更新