有没有办法向mongodb查询添加计数器?
我想为符合我的查询的文档添加一个计数器。例如,第一份文件的计数器为1,第二份文件的计数器为2,依此类推 以下是一段数据:有没有办法向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
"_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
}