দুটি তারিখের মধ্যে বস্তু সন্ধান করুন মঙ্গোডিবি


406

আমি মংডাবের ভিতরে টুইটগুলি সঞ্চয় করার আশেপাশে খেলছি, প্রতিটি বস্তু দেখতে এই রকম:

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

আমি কীভাবে এমন একটি কোয়েরি লিখব যা তৈরি করা_টাকে পরীক্ষা করে এবং 18:47 থেকে 19:00 এর মধ্যে সমস্ত অবজেক্ট খুঁজে পায়? তারিখগুলি একটি নির্দিষ্ট ফর্ম্যাটে সংরক্ষণ করা হয় তাই আমার কী নথিগুলি আপডেট করার দরকার আছে?


আপনি কোন ক্ষেত্রটি সম্পর্কে জিজ্ঞাসা চান তা বলছেন না?
শিঙ্গারা

ওহো, আমি তৈরি করা_টাকে জিজ্ঞাসা করতে চাই এবং দুটি তারিখের মধ্যে সমস্তটি খুঁজতে চাই।
টম

আমি কৌতূহলী যে কেন ডেট ওবজ ব্যবহার করে টাইমস্ট্যাম্প, কোনও সুবিধা ব্যবহার করবেন না?
লিও

4
@ লিও যুগের পর থেকে মিলিসেকেন্ডের চেয়ে ডেট অবজেক্টের সবচেয়ে বড় সুবিধা বা যা যা মানুষের পাঠযোগ্যতা। এই ক্ষেত্রে, আপনার সূচনা পরিসীমাটি সেট করতে 2010-04-29T00:00:00.000Zমিলিসেকেন্ডে একই তারিখ / সময় গণনা করার চেয়ে অনেক সহজ। আপনি খুব সহজেই টাইম জোনের রূপান্তর করতে পারেন। এছাড়াও, তারিখগুলি ইতিমধ্যে লিপ দিবস, লিপ সেকেন্ড এবং অন্যান্য প্রতিকূলতার মতো জিনিসগুলি পরিচালনা করে যা আপনি সাধারণত নিজেকে পরিচালনা করতে চান না।
থান্ডারফোর্জ

উত্তর:


619

মঙ্গোডিবি কুকবুকের একটি তারিখের সীমা (নির্দিষ্ট মাস বা দিন) অনুসন্ধানকরার বিষয়ে বিষয়টি সম্পর্কে খুব ভাল ব্যাখ্যা রয়েছে, তবে নীচে এমন কিছু যা আমি নিজে চেষ্টা করে দেখেছি এবং এটি কাজ করছে বলে মনে হচ্ছে।

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)" }

আমার পরীক্ষার উপর ভিত্তি করে আপনার মোংগোডিবি সমর্থন করে এমন ফর্ম্যাটে আপনার তারিখগুলি সিরিয়ালিয়াল করতে হবে কারণ নিম্নলিখিতটি অনাকাঙ্ক্ষিত অনুসন্ধানের ফলাফল দিয়েছে।

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" }

দ্বিতীয় উদাহরণে কোনও ফলাফল প্রত্যাশিত ছিল না, তবে এখনও একটি অর্জন রয়েছে। এটি কারণ একটি মৌলিক স্ট্রিং তুলনা সম্পন্ন হয়।


3
আকর্ষণীয় দেখায় তবে সঞ্চিত তারিখটি কোনও নির্দিষ্ট ফর্ম্যাটে থাকা দরকার। আমি কেবল টুইটারের মাধ্যমে যা সরবরাহ করা হয়েছিল তা সংরক্ষণ করে চলেছি, এটি কি আলাদা ফর্ম্যাটে পরিবর্তিত হওয়া দরকার?
টম

7
আপনি সম্ভবত টাইমস্ট্যাম্পগুলি স্ট্রিং হিসাবে সংরক্ষণ করেছেন, সুতরাং আমি অনুমান করছি যে মঙ্গোডিবি বুঝতে পারে না যে সেগুলি সত্যিকারের তারিখ। সুতরাং এগুলি সম্পর্কে একটি পরিসীমা ক্যোয়ারী করার ফলে বর্ণমালা সংক্রান্ত ক্যোয়ারী তৈরি হবে (উদাঃ "জান সান 01.01.2010" "জান সান 01.01.1000" এর আগে থাকবে)। মঙ্গোডিবি ফর্ম্যাটে সমস্ত তারিখের ডেটা ফর্ম্যাট করা সম্ভবত বোধগম্য হবে, যা আমি মনে করি যে এটি কেবল সরল জাভাস্ক্রিপ্টের তারিখ।
পোঞ্জাও

2
আমি এই মাত্র আমার স্ট্রিংগুলি তারিখের অবজেক্টগুলিতে রূপান্তর করতে ব্যবহার করেছি stackoverflow.com/questions/2900674/…
টম

ঠিক আছে ভদ্র! আমি অনুমান করতে পারি যে কুকবুকটিতে বর্ণিত রেঞ্জের প্রশ্নগুলি তখন কাজ করা উচিত, আপনি কি ইতিমধ্যে তাদের চেষ্টা করে দেখেছেন?
পোনজাও

হ্যাঁ একবার আমি তারিখগুলি সংরক্ষণ করে রাখি কুকবুকের উদাহরণগুলি প্রত্যাশার সাথে সংশোধন করে।
টম

35

স্পষ্ট করা. যা জানা গুরুত্বপূর্ণ তা হ'ল:

  • হ্যাঁ, আপনাকে একটি জাভাস্ক্রিপ্টের তারিখ অবজেক্টটি পাস করতে হবে।
  • হ্যাঁ, এটি আইএসওডেট বান্ধব হতে হবে
  • হ্যাঁ, আমার কাজটি করার অভিজ্ঞতা থেকে আপনার আইএসওতে তারিখটি ম্যানিপুলেট করা দরকার
  • হ্যাঁ, তারিখগুলি নিয়ে কাজ করা সবসময় একটি ক্লান্তিকর প্রক্রিয়া এবং মঙ্গোও এর ব্যতিক্রম নয়

এখানে কোডের একটি কার্যকারী স্নিপেট রয়েছে, যেখানে আমরা মঙ্গোকে নিশ্চিত করতে কিছুটা তারিখের কারসাজি করি (এখানে আমি মঙ্গুজ মডিউল ব্যবহার করছি এবং সারিগুলির জন্য ফলাফল চাই যার তারিখের বৈশিষ্ট্যটি মাইডেট পরম হিসাবে প্রদত্ত তারিখের চেয়ে কম) হ্যান্ডেল করতে পারে এটি সঠিকভাবে:

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

1
স্পষ্টতা জন্য প্লাস ওয়ান। যদি আপনার ব্যাকএন্ডে মুহুর্তটি ব্যবহার হয় তবে এটি এখনও আইওএসটিস্ট্রিং () ফাংশন ধরে রাখে। আমি আমার প্রশ্নের জন্য সময় যোগ এবং বিয়োগ করতে মুহুর্তটি ব্যবহার করি।
ভোকোজ্যাক্স

17

মোংগোডিবি আসলে একটি তারিখের মিলিসগুলিকে ইনট (64৪) হিসাবে সংরক্ষণ করে, যেমনটি http://bsonspec.org/#/specifications দ্বারা নির্ধারিত

যাইহোক, আপনি যখন তারিখগুলি পুনরুদ্ধার করবেন তখন এটি বেশ বিভ্রান্ত হয়ে উঠতে পারে কারণ ক্লায়েন্ট ড্রাইভার তার নিজস্ব স্থানীয় সময় অঞ্চল দিয়ে একটি তারিখের অবজেক্টটি ইনস্ট্যান্ট করবে। মোঙ্গো কনসোলের জাভাস্ক্রিপ্ট ড্রাইভার অবশ্যই এটি করবে।

সুতরাং, আপনি যদি আপনার সময় অঞ্চলগুলি সম্পর্কে যত্নশীল হন, তবে নিশ্চিত হয়ে নিন যে আপনি এটি ফিরে পেলে এটি কী হওয়ার কথা। আপনার প্রশ্নের তারিখগুলির ক্ষেত্রে টাইমজোনটি নির্ধারিত নির্বিশেষে এটি প্রশ্নের সমান ()৪) এর সমান হবে বলে অনুসন্ধানগুলির পক্ষে এটি এতটা গুরুত্বপূর্ণ নয়। তবে আমি অবশ্যই প্রকৃত তারিখের জিনিসগুলি (স্ট্রিং নয়) নিয়ে অনুসন্ধান করব এবং ড্রাইভারটিকে এটি করতে দিন।


16

পাইথন এবং pymongo

pymongoসংগ্রহের সাথে পাইথনে দুটি তারিখের মধ্যে অবজেক্টগুলি সন্ধান করা posts( টিউটোরিয়ালের ভিত্তিতে ):

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}ক্ষেত্রে পরিসীমা নির্দিষ্ট করে datetime.datetime


এটি কাজ করছে না। আমি যখনই এই ক্যোয়ারীটি চালনা করি তখনই আমি ডিফল্টরূপে সম্পূর্ণ প্রতিক্রিয়া পাই এবং ফিল্টার সাড়া পাই না
অভয় ভি

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

collectionআপনি কোয়েরি কার্যকর করতে চান এমন সংগ্রহের নামের সাথে প্রতিস্থাপন করুন


3
এটি গ্রহণযোগ্য উত্তরে কী যুক্ত করবে (years বছর আগে সরবরাহ করা হয়েছে)?
ড্যান ড্যাসক্লেস্কু

1
পছন্দ করুন
জিএসকে

17
সদৃশ উত্তরগুলি মানুষের সময় নষ্ট করে।
ড্যান ড্যাসক্লেস্কু

10

$gteএবং দুটি তারিখের মধ্যে রেকর্ডটি ব্যবহার করে এই কোডটি ব্যবহার করুন এবং $lt:

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

এটি 8 বছর আগে প্রদত্ত গৃহীত উত্তরটিতে কী যুক্ত করে?
ড্যান ড্যাসক্লেস্কু

7

মোমেন্ট.জেএস এবং তুলনা কোয়েরি অপারেটরগুলির সাথে ব্যবহার করা

  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

আপনার তারিখগুলি GMO টাইমজোনতে রূপান্তর করুন কারণ আপনি সেগুলিকে মঙ্গোতে স্টাফ করছেন। এইভাবে কখনই টাইমজোন সমস্যা নেই। তারপরে আপনি উপস্থাপনাটির জন্য ডেটা পিছনে টেনে আনতে গিয়ে কেবল টুইটার / টাইমজোন ফিল্ডে গণিত করুন।


2

ওয়াইওয়াইএমএমডিডিএইচএমএমএস ফর্মটির পূর্ণসংখ্যায় স্ট্রিং রূপান্তর করবেন না কেন? সময়ের প্রতিটি বৃদ্ধি তারপরে একটি বৃহত্তর পূর্ণসংখ্যার তৈরি করে এবং আপনি আইএসও সময়ে রূপান্তরিত হওয়ার চিন্তা না করে পূর্ণসংখ্যায় ফিল্টার করতে পারেন।


কারণ সময়টি কেবল আমার স্থানীয় সময় অঞ্চলে ঘটছে না।
মাইকেল কোল

2
আপনি একবারে যে কোনও জায়গায় সেই বিন্যাসে সময় রূপান্তর করতে শুরু করলে এটি দুঃস্বপ্ন হয়ে যায়। আপনি যদি খুব কম সময়ে এ জাতীয় কিছু করতে চলেছেন তবে জেএস তারিখের অবজেক্ট থেকে .getTime () থেকে রিটার্ন মানটি ব্যবহার করুন।
নিক্ক ওয়াং

1
কেন আমরা সর্বদা ইউটিসি
তে

2

মোংডবায় তারিখের ডেটার মধ্যে খুঁজে পেতে $ gte এবং $ lte ব্যবহার করুন

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
আপনার উত্তরে কিছুটা টাইপ করুন $ gte not $ get :)
বব

1
দুঃখিত আমি খুব ক্লান্ত অবস্থার উত্তর দিয়েছি, তাই আমি ভুল করেছি। আমার উত্তর আপডেট করতে আপনার সহায়তার জন্য ধন্যবাদ। আপনি ভাল কাজ করেছেন :) @ Bob
KARTHIKEYAN.A

2

আপনি এটি পরীক্ষা করে দেখতে পারেন। আপনি যদি এই পদ্ধতিটি ব্যবহার করে থাকেন তবে মঙ্গো ডেটাবেস থেকে মানগুলি পেতে পার্স ফাংশনটি ব্যবহার করুন:

db.getCollection('user').find({
    createdOn: {
        $gt: ISODate("2020-01-01T00:00:00.000Z"),
        $lt: ISODate("2020-03-01T00:00:00.000Z")
    }
})

1
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`) ]
                        },
                    ]
                 }
              }
           }
        }
     }
])

1

আপনি এটিও পরীক্ষা করতে পারেন বা সমষ্টি ব্যবহারের পরিবর্তে চেষ্টা করতে পারেন

db.getCollection('user').find({
    createdOn: {
        $gt: ISODate("2020-01-01T00:00:00.000Z"),
        $lt: ISODate("2020-03-01T00:00:00.000Z")
    }
})

0

আমি এই মডেলটিতে আমার প্রয়োজনীয়তা অনুসারে চেষ্টা করেছিলাম যখন কোনও বস্তু পরে তৈরি করা হয় তখন আমি একটি তারিখ সংরক্ষণ করতে চাই আমি আমার এইচটিএমএল ফাইলের দুটি তারিখের মধ্যে সমস্ত রেকর্ড (নথি) পুনরুদ্ধার করতে চাই যেখানে আমি নিম্নলিখিত ফর্ম্যাটটি মিমি / ডিডি / ইয়াই ব্যবহার করছিলাম

<!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>

আমার পাই (পাইথন) ফাইলটিতে আমি এটিকে "আইসো ফোমেটে" রূপান্তরিত করেছি

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

এবং আমার সংগ্রহে ক্ষেত্র হিসাবে "সিলেক্টডেট" দিয়ে আমার dbmongo সংগ্রহে সংরক্ষণ করা হয়েছে

আমি নিম্নলিখিত জিজ্ঞাসাটি ব্যবহার করেছি 2 তারিখের মধ্যে ডেটা বা দস্তাবেজগুলি পুনরুদ্ধার করতে

db.collection.find( "SelectedDate": {'$gte': SelectedDate1,'$lt': SelectedDate2}})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.