mongodb使用remove命令删除旧数据

mongodb使用remove命令删除旧数据,mongodb,date,mongodb-query,Mongodb,Date,Mongodb Query,我的mongo db包含 > db.collection.find(); { "_id" : ObjectId("55f8e493d97731874b1235bd"), "Date" : "14-12-2014", "Value" : 25.36 } { "_id" : ObjectId("55f8e497d97731874b1235be"), "Date" : "14-11-2014", "Value" : 25.36 } { "_id" : ObjectId("55f917f748f9

我的mongo db包含

> db.collection.find();
{ "_id" : ObjectId("55f8e493d97731874b1235bd"), "Date" : "14-12-2014", "Value" : 25.36 }
{ "_id" : ObjectId("55f8e497d97731874b1235be"), "Date" : "14-11-2014", "Value" : 25.36 }
{ "_id" : ObjectId("55f917f748f91b35cf1ddaac"), "Date" : "14-01-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f917fc48f91b35cf1ddaad"), "Date" : "14-02-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9180148f91b35cf1ddaae"), "Date" : "14-03-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9180848f91b35cf1ddaaf"), "Date" : "14-04-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9180f48f91b35cf1ddab0"), "Date" : "14-05-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9181448f91b35cf1ddab1"), "Date" : "14-06-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9181948f91b35cf1ddab2"), "Date" : "14-07-2015", "Value" : 25.36 }
{ "_id" : ObjectId("55f9181d48f91b35cf1ddab3"), "Date" : "14-08-2015", "Value" : 25.36 }
我想删除三个月前的数据。为此

> db.collection.remove( { "Date": {$lt:"14-10-2014"} } );

我试过这样做,但效果不好。它的删除仅取决于月份,例如从今天到2105年1月,从2014年9月到2104年1月,而不是从2104年12月和11月。如何解决此问题?

您的日期字段无效,因此首先需要更新您的文档。最好的方法是使用API

var bulk=db.collection.initializeOrderedBulkOp(),
计数=0
db.collection.find().forEach(函数(doc){
var newDate=新日期(doc.Date.replace(/(\d{2})-(\d{2})/,“$2-$1”);
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{“日期”:newDate});
计数++;
如果(计数%100==0){
bulk.execute();
bulk=db.collection.initializeUnderedBulkop();
}
})
如果(计数%100!=0)
bulk.execute();

您的文档现在如下所示:

{u id:ObjectId(“55f8e493d97731874b1235bd”),“Date”:ISODate(“2014-12-13T21:00:00Z”),“Value”:25.36}
{u id:ObjectId(“55f8e497d97731874b1235be”),“Date”:ISODate(“2014-11-13T21:00:00Z”),“Value”:25.36}
{u id:ObjectId(“55f917f748f91b35cf1ddaac”),“日期”:ISODate(“2015-01-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f917fc48f91b35cf1ddaad”),“日期”:ISODate(“2015-02-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180148f91b35cf1ddaae”),“日期”:ISODate(“2015-03-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180848f91b35cf1ddaaf”),“日期”:ISODate(“2015-04-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180f48f91b35cf1ddab0”),“日期”:ISODate(“2015-05-13T21:00:00Z”),“值”:25.36}

然后可以使用
.remove
方法删除旧文档

db.collection.remove({“日期”:{“$lt”:新日期(“2014年10月14日”)}

您的日期字段无效,因此首先需要更新文档。最好的方法是使用API

var bulk=db.collection.initializeOrderedBulkOp(),
计数=0
db.collection.find().forEach(函数(doc){
var newDate=新日期(doc.Date.replace(/(\d{2})-(\d{2})/,“$2-$1”);
bulk.find({“\u id”:doc.\u id}).updateOne({
“$set”:{“日期”:newDate});
计数++;
如果(计数%100==0){
bulk.execute();
bulk=db.collection.initializeUnderedBulkop();
}
})
如果(计数%100!=0)
bulk.execute();

您的文档现在如下所示:

{u id:ObjectId(“55f8e493d97731874b1235bd”),“Date”:ISODate(“2014-12-13T21:00:00Z”),“Value”:25.36}
{u id:ObjectId(“55f8e497d97731874b1235be”),“Date”:ISODate(“2014-11-13T21:00:00Z”),“Value”:25.36}
{u id:ObjectId(“55f917f748f91b35cf1ddaac”),“日期”:ISODate(“2015-01-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f917fc48f91b35cf1ddaad”),“日期”:ISODate(“2015-02-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180148f91b35cf1ddaae”),“日期”:ISODate(“2015-03-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180848f91b35cf1ddaaf”),“日期”:ISODate(“2015-04-13T21:00:00Z”),“值”:25.36}
{u id:ObjectId(“55f9180f48f91b35cf1ddab0”),“日期”:ISODate(“2015-05-13T21:00:00Z”),“值”:25.36}

然后可以使用
.remove
方法删除旧文档

db.collection.remove({“日期”:{“$lt”:新日期(“2014年10月14日”)}

我认为您可以尝试下面的代码。您可以删除文档,而无需将日期字段更新为。作为一种良好的做法,您应该始终将日期存储为。这样可以简化查询

var cursor = db.collection.find()
while (cursor.hasNext()) {
 var doc = cursor.next();
 var docDate = doc.Date;
 var queryDate = "14-10-2014";
 var docDateMillis = new Date(docDate.substring(6,10), docDate.substring(3,5)-1, docDate.substring(0,2)).getTime();
 var queryDateMillis = new Date(queryDate.substring(6,10), queryDate.substring(3,5)-1, queryDate.substring(0,2)).getTime()
 if(docDateMillis < queryDateMillis) {
   db.collection.remove({_id : doc._id})
 }     
}
var cursor=db.collection.find()
while(cursor.hasNext()){
var doc=cursor.next();
var docDate=单据日期;
var queryDate=“14-10-2014”;
var docDateMillis=新日期(docDate.substring(6,10),docDate.substring(3,5)-1,docDate.substring(0,2)).getTime();
var queryDateMillis=新日期(queryDate.substring(6,10),queryDate.substring(3,5)-1,queryDate.substring(0,2)).getTime()
if(docDateMillis
我认为您可以尝试下面的代码。您可以删除文档,而无需将日期字段更新为。作为一种良好的做法,您应该始终将日期存储为。这样可以简化查询

var cursor = db.collection.find()
while (cursor.hasNext()) {
 var doc = cursor.next();
 var docDate = doc.Date;
 var queryDate = "14-10-2014";
 var docDateMillis = new Date(docDate.substring(6,10), docDate.substring(3,5)-1, docDate.substring(0,2)).getTime();
 var queryDateMillis = new Date(queryDate.substring(6,10), queryDate.substring(3,5)-1, queryDate.substring(0,2)).getTime()
 if(docDateMillis < queryDateMillis) {
   db.collection.remove({_id : doc._id})
 }     
}
var cursor=db.collection.find()
while(cursor.hasNext()){
var doc=cursor.next();
var docDate=单据日期;
var queryDate=“14-10-2014”;
var docDateMillis=新日期(docDate.substring(6,10),docDate.substring(3,5)-1,docDate.substring(0,2)).getTime();
var queryDateMillis=新日期(queryDate.substring(6,10),queryDate.substring(3,5)-1,queryDate.substring(0,2)).getTime()
if(docDateMillis
这就可以了

    db.test.remove({'$where':function(){ 
        var x = this.Date.split('-');
        var dt = new Date(x[2], x[1] - 1, x[0]);
        var y='14-10-2014'.split('-');
        var chkDt = new Date(y[2], y[1] - 1, y[0]);
        return dt < chkDt; }})
db.test.remove({'$where':function(){
var x=this.Date.split('-');
var dt=新日期(x[2],x[1]-1,x[0]);
变量y='14-10-2014'。拆分('-');
var chkDt=新日期(y[2],y[1]-1,y[0]);
返回dt
虽然如果在存储时在文档中使用ISODate()会更好,但这可以完成这项工作

    db.test.remove({'$where':function(){ 
        var x = this.Date.split('-');
        var dt = new Date(x[2], x[1] - 1, x[0]);
        var y='14-10-2014'.split('-');
        var chkDt = new Date(y[2], y[1] - 1, y[0]);
        return dt < chkDt; }})
db.test.remove({'$where':function(){
var x=this.Date.split('-');
var dt=新日期(x[2],x[1]-1,x[0]);
变量y='14-10-2014'。拆分('-');
var chkDt=新日期(y[2],y[1]-1,y[0]);
返回dt

虽然在存储时在文档中使用ISODate()会更好,但问题是MongoDB不会将日期字段视为日期,而是字符串。它们必须是ISODate(),让$lt运算符工作。更改日期,您的查询将工作。为什么不将此作为答案发布?它可以帮助其他人看到已经有解决方案。您的问题是MongoDB不将日期字段视为日期,而将其视为字符串。它们必须是ISODate(),以便$lt运算符工作。更改