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
"systemTimeZone": "System.CurrentSystemTimeZone"
]
"urlData":
[0]:
"fullUrl":"https://imgur.com/gallery/EfaQnPY"
"UID":"00000-W3W6C42GWTRE960"
"safety": "safe"
我的查询(这是从 Compass UI 复制的):
$match:
{
$and: [{"UID": "00000-WVUCW3JW7OTHDVE"},
{"timestamp.serverTimestamp":
{
$gte:ISODate("2019-08-01T00:00"),
$lte:ISODate("2019-09-30T00:00")
}}]
}
$unwind:
{
path: "$urlData",
includeArrayIndex: 'index'
}
$match:
{
"index": 0
}
$project:
{
_id: 0,
date: { $dateToString: {
format: "%Y-%m-%d",
date: "$timestamp.serverTimestamp"}},
safety: "$safety",
url: "$urlData.fullUrl",
UID: "$UID"
}
有没有办法在 $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
}
推荐阅读
- pharo - 如何在 Pharo 中使用浏览器创建包?
- c# - 屏幕闪烁的解决方法
- javascript - 通过对象使用 SVG,不想工作
- c++11 - 运算符 new 未定义
- c# - Json Query 在 MCV 中未正确显示
- excel - 综合结果的高分列表
- entity-framework-core - 如何在 Entity Framework Core Migrations 中创建 dbContext 的实例?
- angular - Angular 路由更改后,面包屑并不总是更新
- python - 试图获取足球队所有球员的球员名单,但只获得第一个球员?
- nlp - 具有预定义词性的斯坦福 CoreNLP 词形还原