我有一个存储具有以下结构的文件的集合:
{
"_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/
})
但它不起作用。怎么做?
答案 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)
})