我有一个Collection ,看起来像这样:

{ 
    "_id" : ObjectId("65977bef1ccf990fe33ffc0d"), 
    "email" : "yww24@gmail.com", 
}
{ 
    "_id" : ObjectId("65977bef1ccf990fe33ffc0f"), 
    "email" : "iqiyz@gmail.com", 
    "phone" : "8887774455"
}
{ 
    "_id" : ObjectId("65977bef1ccf990fe33ffc10"), 
    "email" : "46d9s@gmail.com"
}
{ 
    "_id" : ObjectId("65977bef1ccf990fe33ffc0e"), 
    "phone" : "6669997744"
}

我正在try 将其汇总,结果如下所示:

{
  'yww24@gmail.com': 1, // 1 can be any value (e.g. true, "yes", etc)
  'iqiyz@gmail.com': 1,
  '46d9s@gmail.com': 1,
  '8887774455': 1,
  '6669997744': 1
}

一旦从数据库中获取了数据集,我就可以使用lodash库来实现这一点.我只是希望使用MongoDB来做这件事(我的假设是它的资源密集度会更低,但我可能错了).

所以我现在是这样做的:

Coll.aggregate([
    {
        $match: {}
    },
    {
        $project: {
            _id: false,
            email: true,
            phone: true
        }
    }
])
    .then(logs => {
        console.log(logs);
        const result = {emails: _.invertBy(logs, 'email'), phones: _.invertBy(logs, 'phone')}
        delete result.emails.undefined;
        delete result.phones.undefined;
        console.log({...result.emails, ...result.phones});

    })

是的,结果几乎就是我想要的,但是,再说一次,有没有办法在数据库端做到这一点:

{
  'yww24@gmail.com': [ '0' ],
  'iqiyz@gmail.com': [ '1' ],
  '46d9s@gmail.com': [ '2' ],
  '8887774455': [ '1' ],
  '6669997744': [ '3' ]
}

推荐答案

从我的Angular 来看,最好不要为数据库端的投影定制数据,因为您可以在前端/后端实现它.从数据库获取数据应该是一个简单的查询或计算查询.想象一下,当数据库中有大量记录时,这会导致较差的查询性能,并使数据库超载.

但如果您希望这样做,您的问题应该如下所示:

  1. $group-将所有文档组合为一个文档.

  2. $set-设置data字段.

    2.1. $arrayToObject -将对象数组转换为键值对.

    2.1.1.$map-迭代数组中的每个元素并转换为新array.

    2.1.1.1.$setUnion-将数组合并为一个array.另类:$concatArrays.

  3. $replaceWith-用data对象替换输入文档.

db.collection.aggregate([
  {
    $group: {
      _id: null,
      phones: {
        $addToSet: "$email"
      },
      emails: {
        $addToSet: "$phone"
      }
    }
  },
  {
    $set: {
      data: {
        $arrayToObject: {
          $map: {
            input: {
              $setUnion: [
                "$emails",
                "$phones"
              ]
            },
            in: {
              k: "$$this",
              v: 1
            }
          }
        }
      }
    }
  },
  {
    $replaceWith: "$data"
  }
])

Demo @ Mongo Playground

Node.js相关问答推荐

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

CloudTasksClient在Firebase Function % s onDocumentCreated中实例化时导致错误

使用xml-crypto时出现NodeJS XPath解析错误

Playwright - 无法在 img 标签中使用 file:// 访问本地文件

Redis Typescript 删除方法类型转换

未授权使用联合身份未授权用户角色从 Amplify graphQL 访问类型 Y 上的 X

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

在系统启动时启动本地 node 服务器

访问 Mongoose 查询之外的变量

TypeError:changeChecked 不是函数

Node.js + Express 上的多个视图路径

Nodejs 随机免费 tcp 端口

TypeError:winston.Logger 不是带有winston 和morgan 的构造函数

如何使用 gulp-uglify 缩小 ES6 函数?

如何将子集合添加到 Firestore 中的文档?

如何在 node 中找到引用站点 URL?

如何使用 Node.js 在服务器端管理多个 JS 文件

gyp WARN EACCES 用户root没有访问开发目录的权限

异步构造函数

使用 Node.js 和 Express 进行简单的 API 调用