我有这样的Collection :

{
  '_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',
}

我在这里搜索过,但找不到与我面临的问题相匹配的答案,可能是因为关键字错误.

推荐答案

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

  • $map:一个运算符,用于将lookanswer数组转换为具有刚映射的kv字段的文档,这对于使用以下运算符获得哈希映射至关重要
  • $arrayToObject:这允许实现上述操作,即将数组转换为单个文档
  • $mergeObjects:将顶级字段(即_iddatenameprofile)与上面转换的文档组合在一起
  • $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' } 
                }
            } }
        ]
    } } 
]

Mongo Playground

Mongodb相关问答推荐

如何在Mongo Aggregate Query中创建集合的对象ID数组,并在列表中查找另一个集合中的ID

如何用Python和MongoDB找到单据字段的最大值?

mongoDB中数组中的聚合和元素

在运算符 $map 中嵌入运算符 $exists

Mongodb按值分组并计算出现次数

MongoDB C# 驱动程序 2.0 InsertManyAsync 与 BulkWriteAsync

mongoDB vs mySQL - 为什么在某些方面比另一个更好

在 DBeaver 中连接到 Redis 或 MongoDB

实现 twitter 和 facebook 之类的主题标签

Mongo C#忽略属性

指定字段对于 MongoDB 是transient瞬态的,但对于 RestController 不是

Meteor 如何接收对 MongoDB 查询结果的更新?

在 Nodejs 中找不到模块

`fields cannot be identical'和''` mongoimport错误

MongoDB 批处理操作的最大大小是多少?

如何使用服务器实例指定 mongodb 用户名和密码?

Mongodb - 如何在多个字段中查找字符串?

MongoDB备份计划

停止副本集 MongoDB

Mongoid 不在查询中