মংগোডিবি / মঙ্গুজ কোন নির্দিষ্ট তারিখে জিজ্ঞাসা করছেন?


141

একটি নির্দিষ্ট তারিখের জন্য জিজ্ঞাসা করা সম্ভব?

আমি মঙ্গো কুকবুকের মধ্যে দেখতে পেলাম যে আমরা এটির মতো একটি তারিখের সীমা অনুসন্ধান করার জন্য একটি রেঞ্জের জন্য এটি করতে পারি :

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

তবে এটি কি নির্দিষ্ট তারিখের পক্ষে সম্ভব? এটি কাজ করে না:

db.posts.find({"created_on": new Date(2012, 7, 14) })

উত্তর:


212

ডিবিতে আপনি যে তারিখগুলি সংরক্ষণ করেছেন সেগুলি সময় ব্যতীত (কেবল বছর, মাস, দিন) যদি তা কার্যকর হয়।

সম্ভাবনাগুলি হ'ল যে তারিখগুলি আপনি সংরক্ষণ করেছিলেন সেগুলি ছিল new Date()সময়কালের উপাদানগুলি। এই সময়গুলিকে জিজ্ঞাসা করতে আপনার একটি তারিখের সীমা তৈরি করতে হবে যা একদিনে সমস্ত মুহুর্ত অন্তর্ভুক্ত করে।

db.posts.find( //query today up to tonight
  {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

29
মনে রাখবেন যে তারিখ () ফাংশনে, মাসের যুক্তিটি 0 থেকে গণনা শুরু হয়, 1 নয় the অন্যদিকে, দিনগুলি 1 তে গণনা শুরু করে ... বিশদ
মার্ক স্টসবার্গ

দু'জনেরই হার্ড কোডের চেয়ে পরের তারিখটি পেতে 1 দিন করা কি ভাল?
রাজ্জু

2
এই পদ্ধতি কাজ করে জরিমানা যদি তারিখ ভালো সঞ্চিত হয়: >> "তারিখ": ISODate ( "2016-01-04T14: 07: 17.496Z")
santhosh

আপনার নিজের মাস এবং তারিখের সুইচ নেই ches তারিখের ফর্ম্যাটটি
হ'ল: yyy

123

... 5+ বছর পরে, আমি পরিবর্তে ডেট-এফএনএস ব্যবহার করার পরামর্শ দিচ্ছি

import endOfDayfrom 'date-fns/endOfDay'
import startOfDay from 'date-fns/startOfDay'

MyModel.find({
  createdAt: {
    $gte: startOfDay(new Date()),
    $lte: endOfDay(new Date())
  }
})

আমাদের জন্য মোমেন্ট.জেএস ব্যবহার করছি

const moment = require('moment')

const today = moment().startOf('day')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lte: moment(today).endOf('day').toDate()
  }
})

গুরুত্বপূর্ণ: সমস্ত মুহুর্ত পরিবর্তনীয় !

tomorrow = today.add(1, 'days')এটি পরিবর্তন করেও কাজ করে না today। কলিং moment(today)সুস্পষ্টভাবে ক্লোনিংয়ের মাধ্যমে সমস্যার সমাধান করে today


13
আমি .startOf('day')। ঘন্টা (0) .মিনিটস (0)। সেকেন্ডস (0) এর পরিবর্তে ব্যবহার করার পরামর্শ দিই । সুতরাং প্রথম লাইনটি var today = moment().startOf('day')
হ'ল

2
যদি আমরা moment(today)অবজেক্টটি ক্লোন করতে ব্যবহার করি তবে অন্য একটি সমাধান হ'ল:var tomorrow = today.clone().add(1, 'days')
জনহেলসেল

1
@ জোহনটেলসেল অন্তর্নিহিত, একই ফলাফলের চেয়ে সুস্পষ্ট ক্লোনিংয়ের চেয়ে বেশি সম্ভবত পড়া সহজ!
পিয়র-লুক জেনড্রেউ

1
অন্যথা, আমি নিম্নলিখিত সুপারিশ পারে $lt: moment(today).endOf('day')। পরের দিন থেকে প্রকৃত ফলাফল অন্তর্ভুক্ত করা রোধ করতে।
গ্রেডুয়ান

1
আমার জন্য moment(today).endOf('day')সময় সঙ্গে একই দিনে দেয়: 23:59:59.999। সুতরাং আসলে ব্যবহারের জন্য আরও সঠিক দেখায় $lte, অন্যথায় নির্দিষ্ট সময়ে অবজেক্টগুলিকে উপেক্ষা করা হবে।
লিওনপ্রো

11

হ্যাঁ, তারিখ অবজেক্টটি তারিখ এবং সময় সংগ্রহ করে, তাই কেবলমাত্র তারিখের মানের সাথে তুলনা করা কার্যকর হয় না।

জাভাস্ক্রিপ্ট বুলিয়ান এক্সপ্রেশন দিয়ে আরও জটিল শর্তটি প্রকাশ করতে আপনি কেবল simply যেখানে অপারেটরটি ব্যবহার করতে পারেন :)

db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })

created_on2012-07-14তারিখের ক্ষেত্র ক্ষেত্র এবং নির্দিষ্ট তারিখ।

তারিখটি অবশ্যই YYYY-MM-DD ফর্ম্যাটে হওয়া উচিত।

দ্রষ্টব্য:$where অল্প পরিমাণে ব্যবহার করুন , এতে পারফরম্যান্সের প্রভাব রয়েছে।


10

আপনি চেষ্টা করেছেন:

db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

আপনি যে সমস্যার সমাধান করতে যাচ্ছেন তা হ'ল তারিখগুলি মঙ্গোর টাইমস্ট্যাম্প হিসাবে সঞ্চিত থাকে। সুতরাং, একটি তারিখের সাথে মেলে আপনি একটি টাইমস্ট্যাম্পটি মেলতে বলছেন। আপনার ক্ষেত্রে আমি মনে করি আপনি একটি দিন মিলানোর চেষ্টা করছেন (উদাহরণস্বরূপ 00:00 থেকে 23:59 নির্দিষ্ট তারিখে)। যদি আপনার তারিখগুলি সময় ব্যতীত সংরক্ষণ করা হয় তবে আপনার উচিত ঠিক। অন্যথায়, যদি gte কাজ না করে তবে একই দিন (যেমন শুরু = 00: 00, শেষ = 23: 59) আপনার তারিখ নির্দিষ্ট সময়ের জন্য নির্দিষ্ট করার চেষ্টা করুন।

অনুরূপ প্রশ্ন


1
এটিতে নির্দিষ্ট তারিখের চেয়ে কম বয়সী সমস্ত উপাদান অন্তর্ভুক্ত থাকবে, যা সম্ভবত ওপি চেয়েছিল তা নয়। অন্যান্য উত্তরের মতো একটি "এলটি" বিকল্প যুক্ত করার বিষয়টি বিবেচনা করুন।
বেনসওয়ার

আমি মনে করি আপনি যদি এটির $gteবদলে gteরাখেন তবে ভাল হত।
জ্যাক ফাঁকা

এটি ইতিমধ্যে উপরে আরও সঠিকভাবে উত্তর দেওয়া হয়েছে, তবে আমার উত্তর বন্ধ রয়েছে তা জেনে এটি আমাকে বগড করে দিচ্ছিল, তাই আমি প্রশ্নের সঠিক হওয়ার জন্য এটি আপডেট করেছি। আরে, 4 বছর কেটে গেছে। lol
মাইকেল ডি জনসন

6

নির্দিষ্ট দিন থেকে ফলাফল পেতে আপনি API পদ্ধতির জন্য নিম্নলিখিত পদ্ধতির ব্যবহার করতে পারেন:

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'

1

আমাদের ডাটাবেসে সদৃশ ডেটা সম্পর্কিত একটি সমস্যা ছিল, একটি তারিখের ক্ষেত্রের একাধিক মান রয়েছে যেখানে আমাদের বোঝানো হয়েছিল। আমি ভেবেছিলাম যে আমরা যেভাবে সমস্যাটি সমাধান করেছি সেইভাবে যুক্ত করব।

আমাদের কাছে একটি সংখ্যার "মান" ক্ষেত্র এবং একটি তারিখ "তারিখ" ক্ষেত্র সহ "ডেটা" নামে একটি সংগ্রহ রয়েছে। আমাদের এমন একটি প্রক্রিয়া ছিল যা আমরা ভেবেছিলাম আদর্শবান, তবে দ্বিতীয় রানের জন্য প্রতিদিন 2 এক্স মান যুক্ত করে শেষ করেছি:

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

আমাদের কেবল দুটি রেকর্ডের মধ্যে 1 টি প্রয়োজন, তাই ডিবি পরিষ্কার করার জন্য জাভাস্ক্রিপ্টটি রিসর্ট করতে হয়েছিল। আমাদের প্রাথমিক পদ্ধতির ফলাফলগুলি পুনরাবৃত্তি হবে এবং সকাল 6 টা থেকে 11 টা (সমস্ত নকলগুলি সকালে ছিল) এর মধ্যে সময় সহ কোনও ক্ষেত্র সরিয়ে ফেলতে হবে, তবে বাস্তবায়নের সময়, একটি পরিবর্তন ঘটেছে। এটি ঠিক করার জন্য এখানে স্ক্রিপ্টটি ব্যবহৃত হয়েছে:

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

এবং তারপর এটি দিয়ে চালানো mongo thedatabase fixer_script.js

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.