首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询具有创建根的子元素的Mongo聚合

查询具有创建根的子元素的Mongo聚合
EN

Stack Overflow用户
提问于 2021-06-14 05:38:54
回答 1查看 341关注 0票数 1

我有一个在后端生成的查询,在这个项目中,路径是基于根元素构建的。

代码语言:javascript
运行
AI代码解释
复制
{
  data: [
    {
      $project: {
        'Source.Code': {
          $ifNull: [
            '$Source.Code',
            '$$REMOVE'
          ]
        },
        'Source.Description': {
          $ifNull: [
            '$Source.Description',
            '$$REMOVE'
          ]
        },
        'Source._id': {
          $ifNull: [
            '$Source._id',
            '$$REMOVE'
          ]
        }
      }
    }
  ]
}

上面是投影,如您所见,源是基于Source文档中的字段创建的。我的问题是,就像我在子字段中所做的那样,我想检查Source上的Source,如果根本没有文档,就删除它。有点像

代码语言:javascript
运行
AI代码解释
复制
      {
        'Source': {
          $ifNull: [
            '$Source',
            '$$REMOVE'
          ]
        }

我不知道如何在聚合中构建这样的查询。在这里,Source是一个对象,它有多个字段,我希望在Source上检查null,如果它不是null,那么检查它的所有字段,并相应地添加到Source中。

代码语言:javascript
运行
AI代码解释
复制
{
Source: {
    Code: "Code",
    Description: "test",
    _id: "SomeID"
  }
}

如果描述为空,那么

代码语言:javascript
运行
AI代码解释
复制
{
Source: {
    Code: "Code",
    _id: "SomeID"
  }
}

编辑1:

现在,我想添加一个例子,其中我有一个对象源,它有可以被翻译的字段。我所说的可译的意思是,它们是i18n字段,其中包含语言字段。因此,请考虑下面的示例

代码语言:javascript
运行
AI代码解释
复制
{
Source: {
    Code: "Code",
    Description: {
       "en":"test",
       "fr": "testfr",
       "def": "test"
},
    _id: "SomeID"
  }
}

所以从我之前的查询来看

代码语言:javascript
运行
AI代码解释
复制
{
  data: [
    {
      $project: {
        'Source.Code': {
          $ifNull: [
            '$Source.Code',
            '$$REMOVE'
          ]
        },
        'Source.Description': {
          $ifNull: [
            '$Source.Description.en',
            '$$REMOVE'
          ]
        },
        'Source._id': {
          $ifNull: [
            '$Source._id',
            '$$REMOVE'
          ]
        }
      }
    }
  ]
}

因此,Source.Description.en会将.en附加到路径中,以便从描述中获取en。如何更改此边缘情况的查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-14 05:53:26

  • $objectToArraySource对象转换为数组键值格式
  • 按值迭代上述转换数组的循环和筛选器的$filter不是空的。
  • $arrayToObject将键值转换回对象。
  • $addFieldsdesscription获取en
  • $cond来检查它的空对象,然后删除,否则返回
代码语言:javascript
运行
AI代码解释
复制
db.collection.aggregate([
  {
    $project: {
      Source: {
        $arrayToObject: {
          $filter: {
            input: { $objectToArray: "$Source" },
            cond: { $ne: ["$$this.v", null] }
          }
        }
      }
    }
  },
  { $addFields: { "Source.Description": "$Source.Description.en" } },
  {
    $project: {
      Source: {
        $cond: [{ $eq: ["$Source", {}] }, "$$REMOVE", "$Source"]
      }
    }
  }
])

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67971308

复制
相关文章

相似问题

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