Mongodb'da ISODate ile tarih sorgusu çalışmıyor gibi görünüyor


189

MongoDB'de çalışmak için en temel tarih sorgusunu bile elde edemiyorum. Şuna benzer bir belge ile:

{
    "_id" : "foobar/201310",
    "ap" : "foobar",
    "dt" : ISODate("2013-10-01T00:00:00.000Z"),
    "tl" : 375439
}

Ve şuna benzer bir sorgu:

{ 
    "dt" : { 
        "$gte" : { 
            "$date" : "2013-10-01T00:00:00.000Z"
        }
    }
}

Yürütmeden 0 sonuç alıyorum :

db.mycollection.find({
  "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}}
})

Bunun neden işe yaramadığı hakkında bir fikrin var mı?

Başvuru için, bu sorgu Spring's MongoTemplate tarafından üretiliyor, bu yüzden sonuçta MongoDB'ye gönderilen sorgu üzerinde doğrudan denetime sahip değilim.

(PS)

> db.version()
2.4.7

Teşekkürler!

Yanıtlar:


312

MongoDB Genişletilmiş JSON$date bir parçası olmasına rağmen ve varsayılan olarak aldığınız şey bu gerçekten sorgunun bir parçası olarak kullanabileceğinizi sanmıyorum.mongoexport

$dateAşağıdaki gibi tam aramayı deneyin :

db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}})

hata alırsınız:

error: { "$err" : "invalid operator: $date", "code" : 10068 }

Bunu dene:

db.mycollection.find({
    "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")}
})

veya ( @ user3805045 tarafından yapılan yorumları takip ederek ):

db.mycollection.find({
    "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")}
})

ISODatetarihleri ​​zaman olmadan karşılaştırmak da gerekebilir ( @MattMolnar tarafından not edilir ).

Mongo Kabuğundaki Veri Türlerine göre her ikisi de eşdeğer olmalıdır:

Mongo kabuğu, tarihi bir dize veya bir Date nesnesi olarak döndürmek için çeşitli yöntemler sağlar:

  • Geçerli tarihi bir dize olarak döndüren Date () yöntemi.
  • ISODate () sarmalayıcısını kullanarak bir Date nesnesi döndüren yeni Date () yapıcısı.
  • ISODate () sarmalayıcısını kullanarak bir Date nesnesi döndüren ISODate () yapıcısı.

ve kullanımı ISODate yine de bir Date nesnesi döndürmelidir .

{"$date": "ISO-8601 string"}katı JSON gösterimi gerektiğinde kullanılabilir. Olası örneklerden biri Hadoop konektörüdür.


3
Evet. Bence Querynesneyi ilkbaharda bastığınız zaman geri dönen şeyden atıldım. Sorgunun serileştirilmiş formu mutlaka kendi içinde bir tür sinir bozucu olan bir mongo kabuğuna kopyalayabileceğiniz / yapıştırabileceğiniz geçerli bir sorgu değildir. Suçlu burada: grepcode.com/file/repo1.maven.org/maven2/org.mongodb/…
Jason Polites

2
Kısmi (zaman yok) bir tarihi karşılaştırırken, - arasında geçiş new Date('2016-03-09')yapmak zorunda kaldım ISODate('2016-03-09'). İlki, geçmişte bir $gtesorgu için tarihleri ​​döndürürdü .
Matt Molnar

@MattMolnar Kaydetti ve bir atıfla cevabı güncelledi. Teşekkürler.
zero323

92

Gönderen MongoDB yemek kitabı sayfa yorumlarla:

"dt" : 
{
    "$gte" : ISODate("2014-07-02T00:00:00Z"), 
    "$lt" : ISODate("2014-07-03T00:00:00Z") 
}

Bu benim için çalıştı. Tam bağlamda, aşağıdaki komut, dttarih alanının 2013-10-01 (YYYY-AA-GG) Zulu tarihine sahip olduğu her kaydı alır :

db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }})

1
"ISODate undefined" hatası aldım. Bu sorunu çözemedim.
Batuhan Akkaya

@BatuhanAkkaya Pymongo ile pitonda, datetime.datetimeeşdeğerdir ISODate.
jtbr

12

Bunu dene:

{ "dt" : { "$gte" : ISODate("2013-10-01") } }

5

Mongodb istemci gui olarak robomongo kullanıyorum ve aşağıdaki benim için çalıştı

db.collectionName.find({"columnWithDateTime" : {
$lt:new ISODate("2016-02-28T00:00:00.000Z")}})

Uygulama tarafında, nodejs tabanlı sürücü mongodb (v1.4.3) kullanıyorum, uygulama, kullanıcı arabiriminde YYYY-mm-dd gibi tarih veren datepicker kullanır, bu daha sonra 00:00:00 gibi varsayılan zamanla eklenir ve daha sonra verilir. için new Date()yapıcı ve daha sonra kriterler nesne MongoDB verilen, Ben sürücü dönüştürür ISO bugüne kadar tarih ve ardından çalışır ve istenen çıktıyı veren sorgu düşünüyorum ancak aynı new Date()yapıcı değildir çalışır veya aynı için, robo Mongo'da aynı çıktıyı göstermek kriterlerimi kontrol etmek için robomongo kullandığım için garip olan ölçütler.

Varsayılan cli mongoshell hem iyi çalışır Oysa ISODatevenew Date()


1
Bahşiş için teşekkür ederim, Robomongo Mongo Compass'tan çok daha iyi
Alex

5

Json katı modunda, siparişi korumanız gerekir:

{
    "dt": {
        "$gte": {
            "$date": "2013-10-01T00:00:00.000Z"
        }
    }
}

Arama sorgularımı mlab.com'da tanımlamak için çalışan tek şey.


Sorgu çalıştırılırken hata oluştu. Sebep: (invalid_operator) Geçersiz operatör: $ date
sabre tabatabaee yazdi

2

MongoDB kabuğunda:

db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}})

NodeJS kodumda (Mongoose kullanarak)

    SensorEvent.Model.find( {
        from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) }
    } )

'Gönderen' alanının verilen tarihten daha büyük olduğu değerleri döndürmek için sensör olayları koleksiyonumu sorguluyorum


4
Stack Overflow'a hoş geldiniz! Lütfen sadece sorunun cevabını gönderin ve "Bu benim ilk yazım" gibi ekstra şeyler değil. Yığın Taşmasını bir mesaj panosu değil Wikipedia olarak düşünün.
durron597

1

bu benim belgem

"_id" : ObjectId("590173023c488e9a48e903d6"),
    "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "createdAt" : ISODate("2017-04-27T04:26:42.709Z"),
    "flightId" : "590170f97cb84116075e2680",

 "_id" : ObjectId("590173023c488e9a48e903d6"),
        "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "createdAt" : ISODate("2017-04-28T03:26:42.609Z"),
        "flightId" : "590170f97cb84116075e2680",

Şimdi her 27th date document.so i bu kullanılan bulmak istiyorum ....

 > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count()

result:1

bu benim için çalıştı.


0

Şu andan daha küçük veya eşit değer ararken bu benim için çalıştı:

db.collectionName.find({ "dt": { "$lte" : new Date() + "" } });

0

Şununla sarın new Date():

{ "dt" : { "$lt" : new Date("2012-01-01T15:00:00.000Z") } }

0

Eski soru, ama yine de ilk google hit, bu yüzden ben burada daha kolay bulmak daha burada göndermek ...

Mongo 4.2 ve bir aggregate () kullanma:

db.collection.aggregate(
    [
     { $match: { "end_time": { "$gt": ISODate("2020-01-01T00:00:00.000Z")  } } },
     { $project: {
          "end_day": { $dateFromParts: { 'year' : {$year:"$end_time"}, 'month' : {$month:"$end_time"}, 'day': {$dayOfMonth:"$end_time"}, 'hour' : 0  } }
     }}, 
     {$group:{
        _id:   "$end_day",
        "count":{$sum:1},
    }}
   ]
)

Bu size bir tarih olarak groupby değişkenini verir, bazen bileşenlerin kendisi gibi davranmak daha iyidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.