有没有办法向mongodb查询添加计数器?

有没有办法向mongodb查询添加计数器?,mongodb,Mongodb,我想为符合我的查询的文档添加一个计数器。例如,第一份文件的计数器为1,第二份文件的计数器为2,依此类推 以下是一段数据: "_id": ObjectId("5d1b9aea5c1dd54e8c773f42") "timestamp": [ "systemTimestamp": 2019-07-02T17:56:53.765+00:00 "serverTimestamp": 0001-01-01T00:00:00.000+00:00 "sy

我想为符合我的查询的文档添加一个计数器。例如,第一份文件的计数器为1,第二份文件的计数器为2,依此类推

以下是一段数据:

"_id": ObjectId("5d1b9aea5c1dd54e8c773f42")
"timestamp":
    [ 
      "systemTimestamp":    2019-07-02T17:56:53.765+00:00
      "serverTimestamp":    0001-01-01T00:00:00.000+00:00
      "systemTimeZone":     "System.CurrentSystemTimeZone"
    ]
"urlData":
    [0]:
        "fullUrl":"https://imgur.com/gallery/EfaQnPY"

"UID":"00000-W3W6C42GWTRE960"
"safety": "safe"
我的查询(从Compass UI复制):


有没有办法在$project中添加一些东西以包含计数器?

答案就在您的问题本身中。如果将最后一个管道的输出添加到数组中,并且再次使用包含的索引取消选中,则可以获得预期的输出

比如说,我有以下数据:

{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337b"),
    "first" : "John",
    "last" : "Smith"
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337c"),
    "first" : "Alice",
    "last" : "Johnson"
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337d"),
    "first" : "Bob",
    "last" : "Williams"
}
在运行以下查询时:

db.collection.aggregate([
    {
        $group:{
            "_id":null,
            "data":{
                $push:"$$ROOT"
            }
        }
    },
    {
        $unwind:{
            "path":"$data",
            includeArrayIndex: 'counter'
        }
    },
    {
        $addFields:{
            "data.counter":{
                $sum:["$counter",1]
            }
        }
    },
    {
        $replaceRoot:{
            "newRoot":"$data"
        }
    }
]).pretty()
产出将是:

{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337b"),
    "first" : "John",
    "last" : "Smith",
    "counter" : 1
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337c"),
    "first" : "Alice",
    "last" : "Johnson",
    "counter" : 2
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337d"),
    "first" : "Bob",
    "last" : "Williams",
    "counter" : 3
}

那有什么问题?
索引
的计数器应从
0
开始。您希望它从
1
开始吗?我只需要urlData数组的第一个元素,这就是为什么我在索引0上有一个匹配项。因此,对于每个文档,我提取该数组的第一个元素。非常感谢!这正是我所需要的。
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337b"),
    "first" : "John",
    "last" : "Smith",
    "counter" : 1
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337c"),
    "first" : "Alice",
    "last" : "Johnson",
    "counter" : 2
}
{
    "_id" : ObjectId("5d81c3b7a832f81a9e02337d"),
    "first" : "Bob",
    "last" : "Williams",
    "counter" : 3
}