【问题标题】:Remove documents from a MongoDB collection based on "time" of a Date field根据日期字段的“时间”从 MongoDB 集合中删除文档
【发布时间】:2018-03-24 01:29:46
【问题描述】:

我有一个存储具有以下结构的文档的集合:

{ 
    "_id" : NumberLong(-6225637853094968071), 
    "Id" : "1585534", 
    "Type" : NumberInt(42), 
    "InDate" : ISODate("2017-10-05T18:30:00.000+0000"), 
}
{ 
    "_id" : NumberLong(-622563784353458071), 
    "Id" : "15832422", 
    "Type" : NumberInt(42), 
    "InDate" : ISODate("2017-10-06T00:00:00.000+0000"), 
}

我想删除所有具有特定“Id”和“Type”的文档,其中“InDate”字段有时间18:30:00.000+0000。我尝试使用此查询:

 db.collection.remove({
"ChannelType": NumberInt(28),
"HotelId": "1585534",
"CheckInDate": /$18:30:00.000+0000/
})

但它不起作用。如何做到这一点?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    iso日期不匹配字符串,查询中也需要使用isodate

    db.collection.remove({
        "ChannelType": NumberInt(28),
        "HotelId": "1585534",
        "InDate": ISODate(2017-10-05T18:30:00.000+0000)
    })
    

    【讨论】:

    • 这也不起作用,因为它不是有效值。也许您应该在回答之前在 shell 中实际尝试过。
    • 试过了,只是复制/过去错误。更新了它。感谢您显示错误
    • 我相信问题的精神是“不止一个可能的日期”,因此“只使用 time 值”而不是整个日期。因此,为什么您首先尝试了不正确的语法,以及为什么即使纠正了仍然不正确的语法,您仍然是不正确的。
    【解决方案2】:

    正则表达式不适用于非字符串的内容。实际上,没有简单的方法可以通过正则查询表达式中纯粹的时间值来选择BSON Date

    为了做到这一点,您需要提供一个 $where 条件和附加逻辑,以匹配日期值的 时间 部分。

    根据问题中实际提供的数据:

    db.getCollection('collection').remove({
      "Id": "1585534",
      "Type": NumberInt(42),
      "$where": function() {
        return this.InDate.getUTCHours() === 18
          && this.InDate.getUTCMinutes() === 30
      }
    })
    

    这当然只是所提供数据中的第一个文档,尽管它实际上只是由 "Id" 标识,因为该值在两者之间是唯一的。

    .getUTCHours().getUTCMinutes() 是 JavaScript Date 对象方法,这是 BSON Date$where 表达式中使用时的表达方式。


    简单地说,MongoDB 3.6(即将发布)在聚合表达式中允许比 $where 更有效的形式:

    db.getCollection('collection').aggregate([
      { "$match": {
        "Id": "1585534",
        "Type": NumberInt(42),
        "$expr": {
          "$and": [
            { "$eq": [{ "$hour": "$InDate" }, 18 ] },
            { "$eq": [{ "$minute": "$InDate" }, 30] } 
          ] 
        }   
      }}
    ])
    

    但是,此类表达式不能直接与.remove().deleteMany() 等方法一起使用,但$where 表达式可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2016-06-07
      • 2011-12-22
      • 2023-01-31
      • 2017-02-21
      相关资源
      最近更新 更多