我试图通过在MongoDB中使用aggregate framework来找到从嵌套对象数组中删除属性的方法,但我仍然找不到任何解决问题的方法. 我有一个嵌套的对象数组,如下所示:

{
  _id: '...',
  name: 'Warwick',
  description: 'Warwick desc...',
  reply: [
    {
      _id: '...',
      tag: 'champ',
      name: 'Warwick child',
      description: 'Warwick desc...',
      reply: [
         {
           _id: '...',
           tag: 'champ',
           name: 'Warwick child',
           description: 'Warwick desc...',
           reply: []
         },
         ...etc...
      ]
    },
    ...etc...
  ]
}

预期结果:

{
  _id: '...',
  name: 'Warwick',
  description: 'Warwick desc...',
  reply: [
    {
      _id: '...',
      name: 'Warwick child',
      description: 'Warwick desc...',
      reply: [
         {
           _id: '...',
           name: 'Warwick child',
           description: 'Warwick desc...',
           reply: []
         },
         ...etc...
      ]
    },
    ...etc...
  ]
}

我需要的是从数组中的每个元素中删除tag个属性.我试着使用$unset,但在这种情况下似乎不起作用.我怎么才能解决这个问题呢?

推荐答案

我假设reply个镜头的深度还没有确定.我认为您不能完全在聚合框架中做到这一点--但几乎可以使用$function

使用$function并在主体内部定义一个递归函数.会是这个:

db.collection.aggregate([
   {
      $set: {
         reply: {
            $function: {
               body: function (doc, field) {
                  function removeField(obj) {
                     for (let obj in doc) {                         
                        for (let prop in obj) {
                           if (prop === field)
                              delete obj[prop];
                           else if (typeof obj[prop] === 'object')
                              removeField(obj[prop]);
                        }
                     }
                  }
                  removeField(doc);
                  return doc;
               },
               args: ["$reply", "tag"],
               lang: "js"
            }
         }
      }
   }
])

Node.js相关问答推荐

序列化事务未按预期工作

使用NodeJS在S3上传文件时的格式问题

NX无法使用缓存运行根级脚本

已知NPM无法在node.js V12上运行的问题

try 使用 pdf.js 时 pdf.getPage 不是函数

Promise 和 Azure 语音转文本

mongoose 7.0.3 使用运算符 $and 严格搜索日期

我应该转译我的 TypeScript 应用程序吗?

如何从动态Typescript 文件加载模块

NodeJS 中的流 API 数据如何流动?

(Mongoose) 删除 TTL 字段失败

fastify:流过早关闭

如果我使用像 express 这样的 node 服务器,是否需要 webpack-dev-server

我们如何或可以通过 npm 和 Meteor 使用 node 模块?

如何使用 mocha.js 模拟用于单元测试的依赖类?

调用 require 时的 const vs let

为什么 JavaScript 的 parseInt(0.0000005) 打印5?

如何在 Joi 字符串验证中使用枚举值

Puppeteer 记录在 page.evaluate

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题