是否可以在 MongoDB 聚合期间为每个文档创建唯一 ID?

Posted

技术标签:

【中文标题】是否可以在 MongoDB 聚合期间为每个文档创建唯一 ID?【英文标题】:Is it possible to create a unique ID for each document during MongoDB aggregation? 【发布时间】:2022-01-07 03:56:27 【问题描述】:

我创建了一个按用户创建使用报告的管道。 我编写了所有管道并尝试进行最终合并,但我注意到在“on”处没有具有唯一 id 的字段。

我尝试使用$out,但我不能,因为我希望收藏集继续堆叠而不被覆盖。

我只想继续为我的结果插入新的 ObjectId。

$merge: 
  into: "Report",
  on: "?? don't have uniq field ... why we can't just make newId for each new documents!!",
  whenMatched: "i just want to keep insert",
  whenNotMatched: "insert",

我的最终文件看起来像

name:"개발"
userId: ObjectId(6049eeb428398a115cf83404)
purchaseBundleCnt:230
purchaseBundlePriceSum:5769500
yyyymmdd:20211001

在考虑了几种方法后,我发现通过拼接yyyymmdduserId,可以创建一个唯一的id。但是因为不是ObjectID.Type,所以在on中是不接受的。

【问题讨论】:

Does this answer help?否则,由于您正在为每个用户制作报告,看来您可以使用 userId 作为唯一键,或者可能是 _id: userId: ..., yyyymmdd: ... 的复合索引。 @RickN 是的,它似乎对我有帮助!我会试试谢谢! 【参考方案1】:

我不知道我说得对不对,但如果你想为 on 属性生成一个唯一的 id,你可以尝试以下方法:

你可以在 require('mongoose').Types 上找到 ObjectId 构造函数。

var mongoose = require('mongoose');

$merge: 
  into: "Report",
  on: mongoose.Types.ObjectId()

对于 Mongoose 6,您必须在调用前加上 new:

$merge: 
  into: "Report",
  on: new mongoose.Types.ObjectId()

我没有尝试,但我希望这对你有用。

【讨论】:

我试过了,但每个文档都有一个相同的新 ObjectId。

以上是关于是否可以在 MongoDB 聚合期间为每个文档创建唯一 ID?的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb聚合

$group 按 MongoDb 聚合中的每个唯一字符串

mongodb聚合命令

如何在聚合期间将mongodb子集合的objectid转换为字符串

MongoDB 实用数组聚合操作 (2)

MongoDB——聚合管道之$unwind操作