根据日期字段的“时间”从MongoDB集合中删除文档

时间:2017-10-12 07:40:01

标签: mongodb mongodb-query

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

{ 
    "_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/
})

但它不起作用。怎么做?

2 个答案:

答案 0 :(得分:1)

正则表达式不适用于非字符串的内容。实际上没有简单的方法可以在常规查询表达式中纯粹选择targetTask的时间值。

为了做到这一点,你会提供一个$where条件,其附加逻辑只匹配日期值的时间部分。

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

BSON Date

这当然只是所提供数据中的第一个文档,尽管它实际上只是由db.getCollection('collection').remove({ "Id": "1585534", "Type": NumberInt(42), "$where": function() { return this.InDate.getUTCHours() === 18 && this.InDate.getUTCMinutes() === 30 } }) 标识,因为该值在两者之间是唯一的。

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

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

BSON Date

但是,此类表达式无法直接用于.remove().deleteMany()等方法,但$where表达式可以使用。

答案 1 :(得分:0)

Iso日期与字符串不匹配,您还需要在查询中使用isodate

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