在mongo聚合中将ObjectID转换为String

And*_*zzi 16 mongoose mongodb mongodb-query aggregation-framework robo3t

我现在正处于这种情况:我有一个集合X:

{
  _id:ObjectId('56edbb4d5f084a51131dd4c6'),
  userRef:ObjectId('56edbb4d5f084a51131dd4c6'),
  serialNumber:'A123123',
  ...
}
Run Code Online (Sandbox Code Playgroud)

我需要聚合所有文档,用userRef + serialNumber对它们进行分组,所以我试图像这样使用concat:

$group: {
        _id: {
            '$concat': ['$userRef','-','$serialNumber']
        },
       ...
Run Code Online (Sandbox Code Playgroud)

所以基本上在我在MongoDB中的聚合中,我需要通过ObjectId和字符串的串联来分组文档.但是,似乎$ concat只接受字符串作为参数:

uncaught exception: aggregate failed: {

    "errmsg" : "exception: $concat only supports strings, not OID",
    "code" : 16702,
    "ok" : 0
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将ObjectId转换为聚合表达式中的String?

编辑:

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

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

Ash*_*shh 8

现在您可以尝试使用聚合,它只是将 ObjectId 转换为字符串 $toString

db.collection.aggregate([
    { "$addFields": {
        "userRef": { "$toString": "$userRef" }
    }},
    { "$group": {
      "_id": { "$concat": ["$userRef", "-", "$serialNumber"] }
    }}
])
Run Code Online (Sandbox Code Playgroud)

您可以在此处检查输出


And*_*zzi 6

我无法找到一种方法来做我想要的,所以相反,我创建了一个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'
    }
);
Run Code Online (Sandbox Code Playgroud)

  • @SudhanshuGaur看看这是否有帮助.我编辑了评论 (2认同)