আমি কি তারিখ অনুসারে মঙ্গোডিবি অবজেক্টআইডি জিজ্ঞাসা করতে পারি?


145

আমি জানি যে অবজেক্টআইডসে সেটির তৈরি তারিখ রয়েছে। অবজেক্টআইডির এই দিকটি জিজ্ঞাসা করার কোনও উপায় আছে কি?



উত্তর:


224

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

সংক্ষেপে জাভাস্ক্রিপ্ট কোড:

/* This function returns an ObjectId embedded with a given datetime */
/* Accepts both Date object and string input */

function objectIdWithTimestamp(timestamp) {
    /* Convert string date to Date object (otherwise assume timestamp is a date) */
    if (typeof(timestamp) == 'string') {
        timestamp = new Date(timestamp);
    }

    /* Convert date object to hex seconds since Unix epoch */
    var hexSeconds = Math.floor(timestamp/1000).toString(16);

    /* Create an ObjectId with that hex timestamp */
    var constructedObjectId = ObjectId(hexSeconds + "0000000000000000");

    return constructedObjectId
}


/* Find all documents created after midnight on May 25th, 1980 */
db.mycollection.find({ _id: { $gt: objectIdWithTimestamp('1980/05/25') } });

29
খুব সহজ .. এফওয়াইআই, শেলটি শুরু হওয়ার পরে আপনি এই ~/.mongorc.jsফাইলটি এটি উপলব্ধ রাখতে সংরক্ষণ করতে পারেন mongo
স্টেনি

1
আমি রেফারেন্সরিয়ার পেয়েছি: অবজেক্টআইডি সংজ্ঞায়িত করা হয়নি। আমি কীভাবে এটি ঠিক করব?
পিটার

3
আমি মংডবনেটিভ সহ নোডেজ ব্যবহার করছি। "ওভারজেক্টআইডি =" ('মঙ্গোডব') অন্তর্ভুক্ত করে "সংজ্ঞায়িত ত্রুটি নয়" স্থির করে Ob
পিটার

1
আপনি যদি আমার মতো মঙ্গোসকিন ব্যবহার করছেন: পরিবর্তন ObjectId(hexSeconds + "0000000000000000");করুনdb.ObjectID.createFromHexString(hexSeconds + "0000000000000000");
অ্যান্ডার্সস্টম্যান

2
অথবা, মঙ্গুজে, এর সাথে প্রতিস্থাপন করুন ObjectId(): require('mongoose').Types.ObjectId()- require('mongoose')আপনার প্রাথমিক / কনফিগার করা মঙ্গুজ উদাহরণটি কোথায় ।
toblerpwn

34

নোড.জেজে মংডোডব চালকরা প্রদত্ত ইনবিল্ট ফাংশনটি ব্যবহার করে আপনাকে যে কোনও টাইমস্ট্যাম্পের মাধ্যমে জিজ্ঞাসা করতে দেয়:

var timestamp = Date.now();
var objectId = ObjectID.createFromTime(timestamp / 1000);

বিকল্পভাবে, বর্তমান সময়ের আগে রেকর্ড অনুসন্ধান করার জন্য, আপনি সহজভাবে এটি করতে পারেন:

var objectId = new ObjectID(); // or ObjectId in the mongo shell

সূত্র: http://mongodb.github.io/node-mongodb-native/api-bson- জেনারেটেড / বজেক্টিডিটিএইচটিএমএল


3
এটি কোনও জাভাস্ক্রিপ্ট এনভির মধ্যে টাইমস্ট্যাম্প থেকে অবজেক্টআইডি তৈরির সেরা / সহজতম উপায়। কোনটি
অপটির

34

ইন pymongo, এটি এইভাবে করা যেতে পারে:

import datetime
from bson.objectid import ObjectId
mins = 15
gen_time = datetime.datetime.today() - datetime.timedelta(mins=mins) 
dummy_id = ObjectId.from_datetime(gen_time)
result = list(db.coll.find({"_id": {"$gte": dummy_id}}))

ডেটটাইম.ডেটটাইম.টুকনো () বা ডেটটাইম.ডেটটাইম.টোডে () ব্যবহার করে নোট একই ফলাফলটি প্রদান করবে। তারিখের সময়টি আপনার জন্য পরিচালিত হয়।
র‌্যাডটেক

বিকল্পভাবে, pymongoনির্ভরতা ব্যবহার না করে : epoch_time_hex = format(int(time.time()), 'x') (আপনার প্রশ্নের জন্য শূন্যগুলি যুক্ত করতে ভুলবেন না) সময় প্যাকেজটি ব্যবহৃত হয়েছিল ( import time)।
ভাসিলিনোভিকভ

বুঝতে পারেন যে ওপি জাভাস্ক্রিপ্টের জন্য জিজ্ঞাসা করছে, তবে এটি সত্যই আমাকে আমার কোডটি সহজ করতে সহায়তা করেছে। ধন্যবাদ।
ফ্রেড এস

14

যেহেতু কোনও অবজেক্টআইডের প্রথম 4 বাইট আপনার কালানুক্রমিকভাবে প্রশ্ন সংগ্রহের জন্য টাইমস্ট্যাম্পের প্রতিনিধিত্ব করে , কেবল আইডির মাধ্যমে আদেশ করুন:

# oldest first; use pymongo.DESCENDING for most recent first
items = db.your_collection.find().sort("_id", pymongo.ASCENDING)

ডকুমেন্টগুলি পাওয়ার পরে আপনি অবজেক্টআইডের প্রজন্মের সময়টি পেতে পারেন:

id = some_object_id
generation_time = id.generation_time

1
আমি এমন কিছু প্রত্যাশা করছিলাম যা অবজেক্টআইডে এমবেড থাকা সময়কে ব্যবহার করে নির্দিষ্ট সময়ের আগে তৈরি কয়েকটি গণনা তৈরি করার মতো জিনিসগুলি করার অনুমতি দেবে, তবে মনে হয় এটি সরাসরি অ্যাক্সেসযোগ্য নয়। ধন্যবাদ।
Zach

1
আপনি এটি করতে পারেন, লেফটিয়ামের উত্তরটি দেখুন।
এপেন

13

কমান্ডটি কীভাবে সন্ধান করবেন (এই তারিখ [2015-1-12] এই তারিখের [2015-1-15]):

db.collection.find ({_ id: {$ gt: ObjectId (Math.floor ((নতুন তারিখ ('2015/1/12')) / 1000)। স্ট্রিং (16) + "0000000000000000"), t lt: অবজেক্টআইড (ম্যাথ.ফ্লুর ((নতুন তারিখ ('2015/1/15')) / 1000)। স্ট্রিং (16) + "0000000000000000") pretty})। সুন্দর ()

কমান্ডটি গণনা করুন (এই তারিখ [2015-1-12] এই তারিখের [2015-1-15]):

db.collection.count ({_ id: $ t gt: ObjectId (Math.floor ((নতুন তারিখ ('2015/1/12 ')) / 1000)। স্ট্রিং (16) + "0000000000000000"), t lt: অবজেক্টআইড (ম্যাথ.ফ্লুর ((নতুন তারিখ ('2015/1/15')) / 1000)। স্ট্রিং (16) + "0000000000000000")}})

কমান্ডটি সরান (এই তারিখ [2015-1-12] এই তারিখে [2015-1-15]):

db.collection.remove ({_ id: {$ gt: ObjectId (Math.floor (নতুন তারিখ ('2015/1/12 ')) / 1000)। স্ট্রিং (16) + "0000000000000000"), t lt: অবজেক্টআইডি (ম্যাথ.ফ্লুর ((নতুন তারিখ ('2015/1/15')) / 1000)। স্ট্রিং (16) + "0000000000000000")}})


10

আপনি $convert4.0 সংস্করণে অবজেক্টআইড থেকে তারিখটি বের করতে ফাংশনটি ব্যবহার করতে পারেন ।

কিছুটা এইরকম

$convert: { input: "$_id", to: "date" } 

তারিখের শুরু এবং শেষ সময়ের মধ্যে তুলনা করার তারিখে আপনি জিজ্ঞাসা করতে পারেন।

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$convert":{"input":"$_id","to":"date"}}, ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})

অথবা

আপনি $toDateএটি অর্জন করতে শর্টহ্যান্ড ব্যবহার করতে পারেন ।

db.collectionname.find({
  "$expr":{
    "$and":[
      {"$gte":[{"$toDate":"$_id"}, ISODate("2018-07-03T00:00:00.000Z")]},
      {"$lte":[{"$toDate":"$_id"},ISODate("2018-07-03T11:59:59.999Z")]}
    ]
  }
})

কেবলমাত্র $ রূপান্তর ওআর D টু ডেটের ব্যবহার হিসাবে জিজ্ঞাসা করতে চেয়েছিলেন, মঙ্গোকে প্রথমে রূপান্তর করতে হবে এবং তারপরে ডকটি উপস্থিত রয়েছে কিনা তা তুলনা করতে হবে, তবে যদি আমি স্বীকৃত উত্তরের পন্থাটি ব্যবহার করি তবে তারিখটিকে একটি অবজেক্টে রূপান্তর করতে হলে আমি কেবল করণীয় হত ক্লায়েন্ট পক্ষ এবং শুধুমাত্র একবার, সুতরাং আপনি কি মনে করেন না যে সমাধানটি এর চেয়ে আরও কার্যকর হবে? যাইহোক এই দুই অপারেটরটির উপস্থিতি বলার জন্য ধন্যবাদ :)
সুধাংশু গৌর

7

মঙ্গো সংগ্রহে সর্বশেষ 60 দিনের পুরানো নথিপত্র পেতে আমি শেলের কোয়েরির নীচে ব্যবহার করেছি।

db.collection.find({_id: {$lt:new ObjectId( Math.floor(new Date(new Date()-1000*60*60*24*60).getTime()/1000).toString(16) + "0000000000000000" )}})

1
$ Lt এর পরিবর্তে $ gt ব্যবহার করুন। অন্যথায়, এটি পূর্বে সন্নিবেশকৃত নথিগুলি খুঁজে পেয়েছে (আজ -60 দিন))
yoooshi

1
@Vivek প্রথম 4 বাইট অবজেক্ট- UNIX যুগান্তকারী (1970/1/1 00:00:00 ইউটিসি) যেহেতু সেকেন্ডের সংখ্যা প্রতিনিধিত্ব, এবং যেমন তোমার চেয়ে ($ জি.টি.) বৃহত্তর সঙ্গে এটি ব্যবহার করতে পারেন এবং ($ কম lt) নির্দিষ্ট উইন্ডোর মধ্যে তৈরি করা বস্তুগুলি সন্ধান করতে।
জন

5

আপনি যদি একটি ব্যাপ্তি ক্যোয়ারী করতে চান তবে আপনি এই পোস্টে এটি করতে পারেন । উদাহরণস্বরূপ একটি নির্দিষ্ট দিনের জন্য জিজ্ঞাসা করা (অর্থাত 4 এপ্রিল 2015):

> var objIdMin = ObjectId(Math.floor((new Date('2015/4/4'))/1000).toString(16) + "0000000000000000")
> var objIdMax = ObjectId(Math.floor((new Date('2015/4/5'))/1000).toString(16) + "0000000000000000")
> db.collection.find({_id:{$gt: objIdMin, $lt: objIdMax}}).pretty()


2

মঙ্গোবজেক্টআইডি ব্যবহার করে আপনার নীচের মত ফলাফলও খুঁজে পাওয়া উচিত

db.mycollection.find({ _id: { $gt: ObjectId("5217a543dd99a6d9e0f74702").getTimestamp().getTime()}});

3
আপনার ক্যোয়ারী স্টেটমেন্ট ধরে নেওয়া অবজেক্ট আইডি মানটি শুরু হওয়ার সাথে জেনে থাকে যা সর্বদা ক্ষেত্রে হয় না।
ডুইট স্পেন্সার

0

রেলগুলিতে mongoidআপনি ব্যবহার করে জিজ্ঞাসা করতে পারেন

  time = Time.utc(2010, 1, 1)
  time_id = ObjectId.from_time(time)
  collection.find({'_id' => {'$lt' => time_id}})
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.