从MongoDB中的同一数组返回包含两个字段的文档

亚尼克·罗雄(Yanick Rochon)

给定的文件如

{
  _id: 'abcd',
  userId: '12345',
  activities: [
    { status: 'login', timestamp: '10000001' },
    { status: 'logout', timestamp: '10000002' },
    { status: 'login', timestamp: '10000003' },
    { status: 'logout', timestamp: '10000004' },
  ]
}

我正在尝试创建一个管道,例如将返回在两个时间戳之间记录有最新登录/注销活动的所有用户。例如,如果两个时间戳值在10000002之间10000003,则预期文档应为

{
  _id: 'abcd',
  userId: '12345',
  login: '10000003',
  logout: '10000002'
}

如果两个时间戳值在-1之间10000001,则预期文档应为:

{
  _id: 'abcd',
  userId: '12345',
  login: '10000001',
  logout: null
}

等等。

我知道它与聚合有关,我需要$unwind等等,但是我不确定其余的事情,即评估同一文档数组中的两个字段

米克尔

您可以尝试以下汇总:

db.col.aggregate([
    { 
        $unwind: "$activities" 
    },
    {
        $match: {
            $and: [
                { "activities.timestamp": { $gte: "10000001" } },
                { "activities.timestamp": { $lte: "10000002" } }
            ]
        }
    },
    {
        $sort: {
            "activities.timestamp": -1
        }
    },
    {
        $group: {
            _id: "$_id",
            userId: { $first: "$userId" },
            activities: { $push: "$activities" }
        }
    },
    {
        $addFields: {
            login: { $arrayElemAt: [ { $filter: { input: "$activities", as: "a", cond: { $eq: [ "$$a.status", "login" ] } } } , 0 ] },
            logout: { $arrayElemAt: [ { $filter: { input: "$activities", as: "a", cond: { $eq: [ "$$a.status", "logout" ] } } } , 0 ] }
        }
    },
    {
        $project: {
            _id: 1,
            userId: 1,
            login: { $ifNull: [ "$login.timestamp", null ] },
            logout: { $ifNull: [ "$logout.timestamp", null ] }
        }
    }
])

我们需要使用$ unwind + $ sort + $ group来确保我们的活动将按时间戳进行排序。之后,$unwind您可以使用$ match来应用过滤条件。然后,可以将$ filter$ arrayElemAt一起使用以获取过滤后的数组的第一个(最新)值。最后,$project您可以显式使用$ ifNull(否则,如果没有值,则将跳过JSON键)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDb在Java中比较同一集合中的两个字段

Mongodb:在两个字段的数组上创建索引

$ project一个新字段,作为mongodb中至少两个字段

如何从mongoDB中的两个字段进行计数

Extbase查询以比较同一表中的两个字段

如何在管道聚合(mongoDB)中比较文档中的两个字段

比较同一文档的两个字段

$在mongodb中添加两个字段值

$ concat mongodb中的两个字段

如何在同一Realm查询中查询两个字段?

MongoDB将文档字段分为两个字段

如何找到同一数组中包含所有元音的两个元素

MongoDB使用聚合连接两个字段,其中实际字段位于数组中

当一个字段位于子文档数组中时,如何从集合中获取两个字段的不同组合

在mongodb中交换两个字段

Kendo-Grid:一列中包含两个字段

MongoDB:查找文档,其中两个字段的值在已知良好对的列表中。

比较mongodb中不同数组的两个字段

确保数组中的两个字段是唯一的

如何将许多文档中的两个字段数组合并为一个集合?

在Spring MongoDB中,按一列分组,并获得另外两个字段的和

mongodb中两个字段上出现的总数

数据库:从每个数组结果的同一列中获取两个字段

创建一个包含来自两个不同数据表的两个字段的数组

比较所有行的不在同一列中的两个字段

如何在 ElasticSearch 中比较同一文档中的两个字段?

如何从同一行的两个字段相减中获得 MAX() 值

在MongoDB中搜索文档时如何使用两个字段的总和?

比较嵌套数组中的两个字段