1

我在这上面旋转我的轮子。我需要在一个集合中找到所有文档,这些文档的时间戳(“createdTs”)相差 3 秒或更短(要清楚:月/日/时间/年都一样,保存那几秒钟)。createdTs 字段示例(类型为 Date):2021-04-26T20:39:01.851Z

db.getCollection("CollectionName").aggregate([

    { $match: { memberId: ObjectId("1234") } },
     {
       $project:
         {
           year: { $year: "$createdTs" },
           month: { $month: "$createdTs" },
           day: { $dayOfMonth: "$createdTs" },
           hour: { $hour: "$createdTs" },
           minutes: { $minute: "$createdTs" },
           seconds: { $second: "$createdTs" },
           milliseconds: { $millisecond: "$createdTs" },
           dayOfYear: { $dayOfYear: "$createdTs" },
           dayOfWeek: { $dayOfWeek: "$createdTs" },
           week: { $week: "$createdTs" }
         }
     }
])

我尝试了很多不同的变化。我苦苦挣扎的地方是如何将这些发现相互比较。我还希望只搜索整个集合而不匹配“memberId”字段,只收集所有创建时间差异小于 3 秒的文档,然后对它们进行分组/显示。

这可能吗?Mongo 的新人,现在在这上面旋转了两天。任何建议将不胜感激,谢谢!

我在另一篇文章中看到了这个但不确定如何使用它,因为我想比较同一个字段:

db.collection.aggregate([
  { "$project": {
    "difference": {
      "$divide": [
        { "$subtract": ["$logoutTime", "$loginTime"] },
        60 * 1000 * 60
      ]
    }
  }},
  { "$group": {
    "_id": "$studentID",
    "totalDifference": { "$sum": "$difference" }
  }},
  { "$match": { "totalDifference": { "$gte": 20 }}}
])

也在尝试...

db.getCollection("CollectionName").aggregate([
    { $match: { memberId: ObjectId("1234") } },
    {
        $project:
            {
                year: { $year: "$createdTs" },
                month: { $month: "$createdTs" },
                total:
                    { $add: ["$year", "$month"] }
            }
    }
])

但这总共返回 null。不确定是不是因为 $year 和 $month 不同?类型都是 int32,所以我认为这可行。想知道是否有一种方法可以比较所有字段是否为 0,那么如果使用 $group 时秒数不是/差异为 $gte 3,则可以从那里开始。

4

0 回答 0