我现在处于这种情况:

{
  _id:ObjectId('56edbb4d5f084a51131dd4c6'),
  userRef:ObjectId('56edbb4d5f084a51131dd4c6'),
  serialNumber:'A123123',
  ...
}

我需要聚合所有文档,按userRef+serialNumber对它们进行分组,所以我try 使用concat,如下所示:

$group: {
        _id: {
            '$concat': ['$userRef','-','$serialNumber']
        },
       ...

因此,基本上在我的MongoDB聚合中,我需要通过ObjectId和字符串的串联来对文档进行分组.然而,$concat似乎只接受字符串作为参数:

uncaught exception: aggregate failed: {

    "errmsg" : "exception: $concat only supports strings, not OID",
    "code" : 16702,
    "ok" : 0
}

有没有办法在聚合表达式中将ObjectId转换为字符串?

EDIT:

question是相关的,但我认为解决方案不适合我的问题.(特别是因为我不能在聚合期间使用ObjectId.toString())

实际上,我找不到任何ObjectId().Mongo文档中的toString()操作,但我想知道在这种情况下是否有什么棘手的事情可以做.

推荐答案

我找不到一种方法来做我想做的事情,所以我创建了一个MapReduce函数,最终以我想要的方式生成了键(连接其他键).

最后,它看起来像这样:

db.collection('myCollection').mapReduce(
    function() {
        emit(
            this.userRef.str + '-' + this.serialNumber , {
                count: 1,
                whateverValue1:this.value1,
                whateverValue2:this.value2,
                ...
            }
        )
    },
    function(key, values) {
       var reduce = {}
       .... my reduce function....
        return reduce
    }, {
        query: {
            ...filters_here....
        },
        out: 'name_of_output_collection'
    }
);

Mongodb相关问答推荐

MongoDB 4.4如何使用未知密钥更新dict

$mod只支持数字类型,不支持MongoDb中的array和int

用其他集合中的文档替换嵌套文档数组中的值

无法在Ubuntu 22.04上安装MongoDB 7.0

Mongo $sort然后$group,顺序能保证吗?

没有mongoose 的 Express 和 MongoDB

类型错误:db.close is not a function

如何使用 C# MongoDB 驱动程序检索字段子集?

mongoose如何在幕后工作

Java MongoDB/BSON 类混淆

mongoose递归填充

MongoDB聚合排序不起作用

MongoDB $or 查询

java.lang.IncompatibleClassChangeError:Implementing class Mongo

在 Postgres JSON 数组中查询

mongoose字符串到 ObjectID

我们如何使用spring boot为mongodb创建自动生成的字段

MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

停止副本集 MongoDB

试图从 mongoose 获取Collection 列表