mongodb - 从 mongo 中的聚合中过滤对象(过滤内部数组)
问题描述
我有一个聚合,我的目标是删除不符合条件的对象
1- 第一阶段是满足日期标准
2-之后每个值都可以有一个数组,如果内部数组中的一个值不符合日期标准(lte),我想删除整个对象
如果我可以在查找步骤中做到这一点会更好
游乐场: https ://mongoplayground.net/p/lF0UATwdDVJ
数据:应该返回 id 3,4 的对象
[
/** given date : 2020-10-01T00:00:00Z*/
/** should return : id: 3,4*/
{
"id": 1,
"data": {
"ref": null
},
"date": ISODate("2020-09-01T00:00:00Z")
},
{
"id": 2,
"data": {
"ref": null
},
"date": ISODate("2021-01-20T00:00:00Z")
},
{
"id": 3,
"data": {},
"date": ISODate("2020-09-10T00:00:00Z")
},
{
"id": 4,
"data": {
"ref": 1
},
"date": ISODate("2019-08-11T00:00:00Z")
}
]
id 1 不会被返回,因为 id 2 持有 id 1 作为 ref 并且 id 2 的日期比第一个匹配项更新
我尝试了以下聚合,但我仍然得到 id 1
db.collection.aggregate([
{
"$match": {
"date": {
"$lte": ISODate("2020-10-01T00:00:00Z")
}
}
},
{
"$lookup": {
"from": "collection",
"localField": "id",
"foreignField": "data.ref",
"as": "refs"
}
},
{
"$match": {
$or: [
{
refs: []
},
{
"refs": {
"$elemMatch": {
"date": {
"$lte": ISODate("2020-10-01T00:00:00Z")
}
}
}
}
]
}
},
{
$sort: {
date: 1
}
}
])
解决方案
推荐阅读
- codeigniter - 如何在codeigniter中获取从数据库中检索到的数组的值?
- html - 你应该以什么顺序为同一个 HTML 元素声明“id”和“class”,为什么?
- android - 如何在 JSON 下面获取 Packing_charge 的 configurationVal?
- java - 在 Spring 项目中进行测试 - 使用 Mockito 将存储库注入服务
- elasticsearch - elasticsearch 字符串值 vs ids- 性能最佳实践
- java - Hibernate Spring Data 本机查询无法使用 MERGE INTO UPDATE set NULL
- sql - 在同一个表中比较一列
- android - 使用 Google Firebase 更新 SQLite 数据库
- vue.js - v-if 在 VueJS 组件上
- ionic-framework - ionic2+ 如何缓存页面,以便我可以导航到缓存页面的特定页面