$map mongodb中带有索引的$concat字段? [复制]

Posted

技术标签:

【中文标题】$map mongodb中带有索引的$concat字段? [复制]【英文标题】:$concat field with index in $map mongodb? [duplicate] 【发布时间】:2018-11-25 00:13:14 【问题描述】:

我有以下收藏


    "_id" : ObjectId("5b16405a8832711234bcfae7"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Bruce",
    "lastName": "Wayne"
,

    "_id" : ObjectId("5b16405a8832711234bcfae8"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Clerk",
    "lastName": "Kent"
,

    "_id" : ObjectId("5b16405a8832711234bcfae9"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Peter",
    "lastName": "Parker"

我需要$project 一个键索引和$concat 'INV-00' + 根元素的索引

我的输出应该是这样的


    "_id" : ObjectId("5b16405a8832711234bcfae7"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Bruce",
    "lastName": "Wayne",
    "index": "INV-001"
,

    "_id" : ObjectId("5b16405a8832711234bcfae8"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Clerk",
    "lastName": "Kent",
    "index": "INV-002"
,

    "_id" : ObjectId("5b16405a8832711234bcfae9"),
    "createdAt" : ISODate("2018-06-05T07:48:45.248Z"),
    "firstName": "Peter",
    "lastName": "Parker",
    "index": "INV-003"

我可以使用$dateToString 或其他方式将createdAt 格式更改为此Thu Jan 18 2018吗???

提前致谢!!!

【问题讨论】:

更改 createdAt 键格式将如何帮助您推断文档的索引?试图了解你想要做什么 我可以使用 $dateToString 或其他方式将 createdAt 格式更改为 2018 年 1 月 18 日星期四 只是想知道这可能吗?...与索引部分无关@天文 这应该会有所帮助:docs.mongodb.com/manual/reference/operator/aggregation/group/…。 【参考方案1】:

虽然我肯定会建议您在客户端而不是在 MongoDB 内部执行此操作,但您可以通过以下方式获得所需的内容 - 相当暴力但有效:

db.collection.aggregate([
    // you should add a $sort stage here to make sure you get the right indexes

    $group: 
        _id: null, // group all documents into the same bucket
        docs:  $push: "$$ROOT"  // just to create an array of all documents
    
, 
    $project: 
        docs:  // transform the "docs" field
            $map:  // into something
                input:  $range: [ 0,  $size: "$docs"  ] , // an array from 0 to n - 1 where n is the number of documents
                as: "this", // which shall be accessible using "$$this"
                in: 
                    $mergeObjects: [ // we join two documents
                         $arrayElemAt: [ "$docs", "$$this" ] , // one is the nth document in our "docs" array
                         "index":  $concat: [ 'INV-00',  $substr: [  $add: [ "$$this", 1 ] , 0, -1 ]  ]   // and the second document is the one with our "index" field
                    ]
                
            
        
    
, 
    $unwind: "$docs" // flatten the result structure
, 
    $replaceRoot: 
        newRoot: "$docs" // restore the original document structure
    
])

【讨论】:

@NeilLunn:a)您似乎没有阅读我的起始免责声明,这实际上与您在上述对该问题的评论中所建议的相同。 b) 并非每个人的收藏中都有数十亿份文件。 c)我很清楚的 BSON 限制不适用于聚合管道。

以上是关于$map mongodb中带有索引的$concat字段? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JPQL 中带有 JPA 的本机查询的“GROUP_CONCAT”是不是有替代方案?

在子选择中带有 GROUP_CONCAT 的 Mysql

javascript中带有html字符串的concat函数

MongoDB Map Reduce:自动创建的索引名称太长,可以自定义吗?

MongoDB基础

索引中带有 `.` 的字典项