如何聚合过滤器嵌套文档并从其他字段中获取值

懒惰的

我有一个这样的集合:

{
  '_id' : ObjectId('6251f8556e75125f9260f333'),
  'name': 'jojo',
  'profile': 'jojo profile',
  'date': ISODate("2022-04-09T21:18:40.473Z"),
  'look': [
    { 'art': 'group-id', 'data': 'alma', 'dt': '1'},
    { 'art': 'called', 'data': 'central', 'dt': '1'},
    { 'art': 'access-time', 'data': 108000, 'dt': '1'}
  ]
  'answer': [
    { 'art': 'rate-id', 'data': 'limit1', 'dt': '1'},
    { 'art': 'protocol', 'data': 'tcp', 'dt': '1'}
  ]
},
{
  '_id' : ObjectId('6251f8306e75125f9260f332'),
  'name': 'dodo',
  'profile': 'dodo profile',
  'date': ISODate("2022-04-09T15:20:58.562Z"),
  'look': [
    { 'art': 'group-id', 'data': 'alma', 'dt': '1'},
    { 'art': 'called', 'data': 'central', 'dt': '1'},
  ]
  'answer': [
    { 'art': 'rate-id', 'data': 'limit1', 'dt': '1'},
  ]
},
{
  '_id' : ObjectId('6251a5113700ba4a0a59c48f'),
  'name': 'kaka',
  'profile': 'kaka profile',
  'date': ISODate("2022-04-09T15:22:25.816Z"),
  'look': [
    { 'art': 'access-time', 'data': 50400, 'dt': '1'}
  ]
  'answer': [
    { 'art': 'protocol', 'data': 'tcp', 'dt': '1'}
  ]
}

我期待这样的输出:

{
  '_id' : ObjectId('6251f8556e75125f9260f333'),
  'name': 'jojo',
  'profile': 'jojo profile',
  'date': ISODate("2022-04-09T21:18:40.473Z"),
  'goup': 'alma',        // filter by 'group-id' and put value of data field
  'called': 'central',   // filter by 'called' and put value of data field
  'accessTime': 108000,  // filter by 'access-time' and put value of data field
  'rate': 'limi1',       // filter by 'rate-id' and put value of data field
  'protocol': 'tcp',     // filter by 'protocol' and put value of data field
},
{
  '_id' : ObjectId('6251f8306e75125f9260f332'),
  'name': 'dodo',
  'profile': 'dodo profile',
  'date': ISODate("2022-04-09T15:20:58.562Z"),
  'goup': 'alma',
  'called': 'central',
  'accessTime': '',     // set blank data if not exist
  'rate': 'limi1',
  'protocol': '',       // set blank data if not exist
},
{
  '_id' : ObjectId('6251a5113700ba4a0a59c48f'),
  'name': 'kaka',
  'profile': 'kaka profile',
  'date': ISODate("2022-04-09T15:22:25.816Z"),
  'goup': '',          // set blank data if not exist
  'called': '',        // set blank data if not exist
  'accessTime': 50400,
  'rate': '',          // set blank data if not exist
  'protocol': 'tcp',
}

我在这里搜索过,但找不到与我面临的问题相匹配的答案,可能是因为关键字错误。由于我是 mongodb 的新手,我对如何解决我想要的查询感到困惑。我怎样才能做到这一点?请帮我...

克里斯丹

您将需要一个聚合操作,该操作具有包含以下关键运算符和阶段的管道:

  • $map:一个运算符,用于将look和答案arrays转换为仅具有映射kv字段的文档,这对于使用以下运算符获得哈希映射至关重要
  • $arrayToObject:这使上述成为可能,即将数组转换为单个文档
  • $mergeObjects: 将顶级字段(即_id, date, name, )profile与上面转换的文档组合在一起
  • $replaceWith:管道阶段,用上面的指定文档替换根文档

总体而言,您的管道应遵循:

const first = { 
   $first: {
      $split: ['$$this.art', '-']
   }
};
const keyExpression = {
   $cond: [
     { $eq: [first, 'access'] },
     'accessTime',
     first
   ]
};

const pipeline = [
    { $replaceWith: {
        $mergeObjects: [
            {  
                _id: '$_id', 
                date: '$date', 
                name: '$name', 
                profile: '$profile',
                protocol: '',
                group: '',
                called: '',
                rate: '',
                accessTime: '',
            },
            { $arrayToObject: {
                $map: {
                  input: '$look',
                  in: { k: keyExpression, v: '$$this.data' } 
                }
            } },
            { $arrayToObject: {
                $map: {
                  input: '$answer',
                  in: { k: keyExpression, v: '$$this.data' } 
                }
            } }
        ]
    } } 
]

蒙戈游乐场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何构建聚合管道以根据其他文档中的字段值过滤文档?

如何从CIRowAverage过滤器获取值?

如何从Elasticsearch中的过滤器获取所有文档?

过滤期间过滤器未从只读字段中获取值

如何将Search API模块中的搜索输入字段(过滤器)移动到其他区域(Drupal 7)?

如何使用 substr 函数验证过滤器并从 Oracle PLSQL 中的存储过程获取结果?

Logstash从logstash过滤器中的[@metadata]获取值

如何仅带回嵌套文档适合过滤器

如何在 MongoDB 中使用数组嵌套过滤器获取特定字段值?

将过滤器应用于Cocoa中的NSArrayController后,如何从NSArray获取值

集合的每个文档中的MongoDB过滤器数组字段

如何建立获取其他参数过滤器的方法?

如何在具有多个组合字段的过滤器的集合中查找文档?

mongodb嵌套文档的过滤器数组

是否可以使django admin字段过滤器使用同一模型中的其他字段数据?

如何在过滤器聚合中执行 AND / OR

如何使用 Java 只从匹配特定过滤器的 MongoDB 文档中获取

如何通过Android Cloud Firestore中的集合过滤器获取文档数

如何从表格中的其他表定义度量过滤器

如何在 Rtweet 的 search_fullarchive 查询中包含语言和其他过滤器?

如何使用域过滤器从odoo13中的模型中的所有其他其他记录中仅过滤掉Many2many字段中的选定记录

在弹性搜索中使用过滤器查询嵌套字段上的聚合

让grok过滤器创建嵌套字段

Elasticsearch过滤器/计数嵌套字段

如何从其他条件中获取值?

如何使用 substr/regex 函数验证过滤器并从 Oracle PLSQL 中的存储过程获取结果?

RethinkDB过滤器并从嵌套数组中检索值

从Elasticsearh的嵌套和聚合中删除选定的过滤器以执行过滤的搜索

如何使用过滤器从ouchdb中删除文档?