首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于状态的mongoDb滤波结果

基于状态的mongoDb滤波结果
EN

Stack Overflow用户
提问于 2022-04-15 22:45:06
回答 1查看 50关注 0票数 3

我有这样一个数组

代码语言:javascript
复制
[
{
    "name": "CAMP-1",
    "status": "incomplete",
    "version": 3,
  },
  {
    "name": "CAMP-1",
    "status": "complete",
    "version": 2,
  },
  {
    "name": "CAMP-1",
    "status": "complete",
    "version": 1,
  },
  {
    "name": "CAMP-2",
    "status": "complete",
    "version": 2,
  },
{
    "name": "CAMP-2",
    "status": "incomplete",
    "version": 1,
  }
]

如果最新版本的状态不完整,则应同时返回最新的不完整版本和完整版本。

如果最新版本的状态已完成,则只应返回该版本。

我试着按名称和状态分组,这提供了最新版本的不完整和完整的对象。

代码语言:javascript
复制
db.collection.aggregate({
  "$sort": {
    "version": -1
  }
},
{
  "$group": {
    "_id": {
      "content": "$name",
      "status": "$status"
    },
    "status": {
      "$first": "$$ROOT"
    },
    "content": {
      "$first": "$$ROOT"
    }
  }
},
{
  "$replaceRoot": {
    "newRoot": "$content"
  }
})

我得到的输出是

代码语言:javascript
复制
[
{
    "name": "CAMP-1",
    "status": "incomplete",
    "version": 3,
  },
{
    "name": "CAMP-1",
    "status": "complete",
    "version": 2,
  },
  {
    "name": "CAMP-1",
    "status": "complete",
    "version": 1,
  },
{
    "name": "CAMP-2",
    "status": "incomplete",
    "version": 2,
  }
]

但预期的产出是

代码语言:javascript
复制
[
{
    "name": "CAMP-1",
    "status": "incomplete",
    "version": 3,
  },
{
    "name": "CAMP-1",
    "status": "complete",
    "version": 2,
  },
{
    "name": "CAMP-2",
    "status": "complete",
    "version": 2,
  }
]

有谁能帮助我们如何根据状态过滤数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-04-16 00:52:16

查询

  • 按名称分组
  • 找到最大完整的版本
  • 筛选以保留相同版本的已完成版本和较大版本的未完成部分。
  • 松开和替换根

*例如,对于一个名称,如果您有不完整的版本5 6 7 3和完整2 3 4,您将得到5 6 7不完成和4完成。

如果这不是你想要的,也许通过小小的改变,你就能得到你所需要的。

花花果 (看看每一个阶段都会把鼠标放到它的末端)

代码语言:javascript
复制
aggregate(
[{"$group": {"_id": "$name", "docs": {"$push": "$$ROOT"}}},
 {"$set": 
   {"max-complete": 
     {"$let": 
       {"vars": 
         {"c": 
           {"$filter": 
             {"input": "$docs",
              "cond": {"$eq": ["$$this.status", "complete"]}}}},
        "in": {"$max": "$$c.version"}}}}},
 {"$set": 
   {"docs": 
     {"$filter": 
       {"input": "$docs",
        "cond": 
         {"$or": 
           [{"$and": 
               [{"$gt": ["$$this.version", "$max-complete"]},
                 {"$eq": ["$$this.status", "incomplete"]}]},
             {"$and": 
               [{"$eq": ["$$this.version", "$max-complete"]},
                 {"$eq": ["$$this.status", "complete"]}]}]}}}}},
 {"$unwind": "$docs"},
 {"$replaceRoot": {"newRoot": "$docs"}}])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71889602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档