it-swarm-tr.com

İki tarih arasındaki nesneleri bulma MongoDB

Mododb içinde tweetleri saklamak üzereydim, her nesne şuna benziyor:

{
"_id" : ObjectId("4c02c58de500fe1be1000005"),
"contributors" : null,
"text" : "Hello world",
"user" : {
    "following" : null,
    "followers_count" : 5,
    "utc_offset" : null,
    "location" : "",
    "profile_text_color" : "000000",
    "friends_count" : 11,
    "profile_link_color" : "0000ff",
    "verified" : false,
    "protected" : false,
    "url" : null,
    "contributors_enabled" : false,
    "created_at" : "Sun May 30 18:47:06 +0000 2010",
    "geo_enabled" : false,
    "profile_sidebar_border_color" : "87bc44",
    "statuses_count" : 13,
    "favourites_count" : 0,
    "description" : "",
    "notifications" : null,
    "profile_background_tile" : false,
    "lang" : "en",
    "id" : 149978111,
    "time_zone" : null,
    "profile_sidebar_fill_color" : "e0ff92"
},
"geo" : null,
"coordinates" : null,
"in_reply_to_user_id" : 149183152,
"place" : null,
"created_at" : "Sun May 30 20:07:35 +0000 2010",
"source" : "web",
"in_reply_to_status_id" : {
    "floatApprox" : 15061797850
},
"truncated" : false,
"favorited" : false,
"id" : {
    "floatApprox" : 15061838001
}

created_at 'yi kontrol eden ve 18:47 ile 19:00 saatleri arasında tüm nesneleri bulan bir sorguyu nasıl yazarım? Belgelerimi tarihler belirli bir biçimde depolanacak şekilde güncellemem gerekir mi?

339
Tom

Tarih Aralığı İçin Sorgulama (Belirli Ay veya Gün) içinde MongoDB Yemek Tarifleri konuyla ilgili çok iyi bir açıklaması var, ama aşağıda kendimi denedim ve işe yarıyor gibi görünüyor.

items.save({
    name: "example",
    created_at: ISODate("2010-04-30T00:00:00.000Z")
})
items.find({
    created_at: {
        $gte: ISODate("2010-04-29T00:00:00.000Z"),
        $lt: ISODate("2010-05-01T00:00:00.000Z")
    }
})
=> { "_id" : ObjectId("4c0791e2b9ec877893f3363b"), "name" : "example", "created_at" : "Sun May 30 2010 00:00:00 GMT+0300 (EEST)" }

Deneylerime dayanarak, tarihlerinizi MongoDB'nin desteklediği bir formatta serileştirmeniz gerekecek, çünkü aşağıdakiler istenmeyen arama sonuçlarını verdi.

items.save({
    name: "example",
    created_at: "Sun May 30 18.49:00 +0000 2010"
})
items.find({
    created_at: {
        $gte:"Mon May 30 18:47:00 +0000 2015",
        $lt: "Sun May 30 20:40:36 +0000 2010"
    }
})
=> { "_id" : ObjectId("4c079123b9ec877893f33638"), "name" : "example", "created_at" : "Sun May 30 18.49:00 +0000 2010" }

İkinci örnekte sonuç beklenmiyordu, ancak hala bir tane var. Bunun nedeni, basit bir dize karşılaştırması yapılmasıdır.

517
ponzao

Netleşmeştirmek. Bilmeniz gereken önemli olan şudur:

  • Evet, bir Javascript Date nesnesini iletmelisiniz.
  • Evet, ISODate dostu olmalı
  • Evet, bu işe yarayacak deneyimlerime göre, tarihi ISO'ya çevirmeniz gerekiyor
  • Evet, tarihlerle çalışmak genellikle her zaman sıkıcı bir süreçtir ve mongo istisna değildir

İşte Mongo'yu sağlamak için bir miktar tarih manipülasyonu yaptığımız bir kod pasajı var (burada mongoose modülünü kullanıyorum ve tarih özelliği, myDate param olarak verilen tarihten daha önce olan satırlar için sonuçlar istiyor) doğru:

var inputDate = new Date(myDate.toISOString());
MyModel.find({
    'date': { $lte: inputDate }
})
27
arcseldon

MongoDB aslında bir tarihin milisini http://bsonspec.org/#/specification 'de belirtildiği gibi int (64) olarak saklar.

Ancak, istemci sürücüsü kendi yerel saat dilimiyle bir tarih nesnesini somutlaştıracağından tarihleri ​​aldığınızda kafa karıştırıcı olabilir. Mongo konsolundaki JavaScript sürücüsü kesinlikle bunu yapacak.

Yani, saat dilimlerinizi önemsiyorsanız, geri aldığınızda ne olması gerektiğini bildiğinizden emin olun. Bu, tarih nesnenizin hangi saat diliminde olduğuna bakılmaksızın, aynı int (64) 'e eşit olacağı için, sorgular için çok da önemli olmamalıdır. Ancak kesinlikle gerçek tarih nesneleriyle (dizeler değil) sorgulamalar yaparım ve sürücünün işini yapmasına izin veririm.

16
Ben Smith
db.collection.find({"createdDate":{$gte:new ISODate("2017-04-14T23:59:59Z"),$lte:new ISODate("2017-04-15T23:59:59Z")}}).count();

collection yerine, sorguyu gerçekleştirmek istediğiniz koleksiyonun adını değiştirin

10
GSK

Python ve pymongo

Python'da iki tarih arasındaki nesneleri pymongo koleksiyonuyla posts koleksiyonunda bulabilirsiniz ( tutorial ):

from_date = datetime.datetime(2010, 12, 31, 12, 30, 30, 125000)
to_date = datetime.datetime(2011, 12, 31, 12, 30, 30, 125000)

for post in posts.find({"date": {"$gte": from_date, "$lt": to_date}}):
    print(post)

{"$gte": from_date, "$lt": to_date} aralığı, datetime.datetime türleri cinsinden belirtir.

9
Anton Tarasenko

$gte ve $lt kullanarak iki tarih arasındaki kaydı bulmak için bu kodu kullanın:

db.CollectionName.find({"whenCreated": {
    '$gte': ISODate("2018-03-06T13:10:40.294Z"),
    '$lt': ISODate("2018-05-06T13:10:40.294Z")
}});
5
Sunil Pal

Tarihlerinizi, Mongo'ya doldururken GMT saat dilimine dönüştürün. Bu şekilde hiçbir zaman dilimi sorunu olmaz. Ardından, sunum için verileri geri çekerken, Twitter/saat diliminde sadece matematiği yapın.

2
heregear

Moment.js ve ile karşılaştırma Sorgu Operatörleri

  var today = moment().startOf('day');
  // "2018-12-05T00:00:00.00
  var tomorrow = moment(today).endOf('day');
  // ("2018-12-05T23:59:59.999

  Example.find(
  {
    // find in today
    created: { '$gte': today, '$lte': tomorrow }
    // Or greater than 5 days
    // created: { $lt: moment().add(-5, 'days') },
  }), function (err, docs) { ... });
2
TinhNQ

Neden dize YYYYMMDDHHMMSS formunun bir tamsayıya dönüştürülmüyor? Her bir zaman artışı, daha büyük bir tamsayı oluşturur ve ISO zamanına dönüştürme endişesi yerine tamsayıları filtreleyebilirsiniz.

2
ZacharyST

mongodb'daki tarih verileriyle bulmak için $ gte ve $ lte kullanın.

var tomorrowDate = moment(new Date()).add(1, 'days').format("YYYY-MM-DD");
db.collection.find({"plannedDeliveryDate":{ $gte: new Date(tomorrowDate +"T00:00:00.000Z"),$lte: new Date(tomorrowDate + "T23:59:59.999Z")}})
1
KARTHIKEYAN.A

bu modelde gereksinimlerime göre denedim, bir nesnenin daha sonra yaratıldığı bir tarihi kaydetmem gerekiyor, html dosyamdaki iki tarih arasındaki tüm kayıtları (belgeler) almak istiyorum.

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>
<head>

    <script>
//jquery
    $(document).ready(function(){  
    $("#select_date").click(function() { 
    $.ajax({
    type: "post",
    url: "xxx", 
    datatype: "html",
    data: $("#period").serialize(),  
    success: function(data){
    alert(data);
    } ,//success

    }); //event triggered

    });//ajax
    });//jquery  
    </script>

    <title></title>
</head>

<body>
    <form id="period" name='period'>
        from <input id="selecteddate" name="selecteddate1" type="text"> to 
        <input id="select_date" type="button" value="selected">
    </form>
</body>
</html>

benim py (python) dosyama aşağıdaki şekilde "iso fomate" dönüştürdü

date_str1   = request.POST["SelectedDate1"] 
SelectedDate1   = datetime.datetime.strptime(date_str1, '%m/%d/%Y').isoformat()

ve dbmongo koleksiyonumda "SelectedDate" ile koleksiyonumdaki alan olarak kaydedildi

2 tarih arasında veri veya belge almak için sorguyu takiben kullandım

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
0
ayu for u
mongoose.model('ModelName').aggregate([
    {
        $match: {
            userId: mongoose.Types.ObjectId(userId)
        }
    },
    {
        $project: {
            dataList: {
              $filter: {
                 input: "$dataList",
                 as: "item",
                 cond: { 
                    $and: [
                        {
                            $gte: [ "$$item.dateTime", new Date(`2017-01-01T00:00:00.000Z`) ]
                        },
                        {
                            $lte: [ "$$item.dateTime", new Date(`2019-12-01T00:00:00.000Z`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])
0
Jitendra