我尝试了以下操作,并理解$
返回第一个匹配元素。
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。