পিমোঙ্গো দিয়ে কীভাবে মংডোব বাছাই করা যায়


164

আমার মঙ্গোডিবি জিজ্ঞাসা করার সময় আমি বাছাই করা বৈশিষ্ট্যটি ব্যবহার করার চেষ্টা করছি, তবে এটি ব্যর্থ হচ্ছে। একই কোয়েরিটি মঙ্গোডিবি কনসোলে কাজ করে তবে এখানে নয়। কোডটি নিম্নরূপ:

import pymongo

from  pymongo import Connection
connection = Connection()
db = connection.myDB
print db.posts.count()
for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({u'entities.user_mentions.screen_name':1}):
    print post

আমি যে ত্রুটিটি পেয়েছি তা হ'ল:

Traceback (most recent call last):
  File "find_ow.py", line 7, in <module>
    for post in db.posts.find({}, {'entities.user_mentions.screen_name':1}).sort({'entities.user_mentions.screen_name':1},1):
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/cursor.py", line 430, in sort
  File "/Library/Python/2.6/site-packages/pymongo-2.0.1-py2.6-macosx-10.6-universal.egg/pymongo/helpers.py", line 67, in _index_document
TypeError: first item in each key pair must be a string

আমি অন্য কোথাও একটি লিঙ্ক পেয়েছি যা বলছে যে পাইমোঙ্গো ব্যবহার করা হলে আমি কীটির 'ইউ' ফ্রন্ট স্থাপন করা দরকার, তবে এটি কোনওরূপে কার্যকর হয়নি। অন্য যে কেউ এটি কাজ করতে পায় বা এটি একটি বাগ।

উত্তর:


302

.sort(), পাইমঙ্গোতে লাগে keyএবং directionপরামিতি হিসাবে।

সুতরাং আপনি যদি অনুসারে বাছাই করতে চান, আসুন বলুন, idআপনার উচিত.sort("_id", 1)

একাধিক ক্ষেত্রের জন্য:

.sort([("field1", pymongo.ASCENDING), ("field2", pymongo.DESCENDING)])

124
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])একাধিক ক্ষেত্র বাছাই।
সমৃদ্ধ

4
যারা আরও বিশদ সন্ধান করছেন তাদের জন্য, এখানে পিমোঙ্গো এপি.মোংডব.অর্গ
শ্যান রিস্টেল

21
দ্রষ্টব্য: আরোহী: 1, অবতরণ -১
মার্টারলাক

2
কেন তারা এত সহজে {"ফিল্ড 1": 1, "ফিল্ড 2": 1} জেএসওন স্বরলিপি বুক করেছেন কেন?
নিকো

2
@ নিকো - নীচে রোমোমাদুর উত্তর দেখুন
বাজাল

34

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

db.Account.find().sort("UserName")  
db.Account.find().sort("UserName",pymongo.ASCENDING)   
db.Account.find().sort("UserName",pymongo.DESCENDING)  

17

এটিও কাজ করে:

db.Account.find().sort('UserName', -1)
db.Account.find().sort('UserName', 1)

আমি এটি আমার কোডটিতে ব্যবহার করছি, দয়া করে মন্তব্য করুন আমি এখানে কিছু ভুল করছি কিনা, ধন্যবাদ।


আপনার ব্যবহার করা উচিত: ASCENDINGএবং DESCENDINGথেকে pymongo। :)
Sn0pY

7

অজগর কেন ডুপ পরিবর্তে টিপলগুলির তালিকা ব্যবহার করে?

অজগরটিতে আপনি গ্যারান্টি দিতে পারবেন না যে অভিধানটি আপনার ঘোষিত ক্রম অনুযায়ী ব্যাখ্যা করা হবে।

সুতরাং, মঙ্গো শেলের মধ্যে আপনি যা করতে পারতেন .sort({'field1':1,'field2':1})এবং দোভাষীকে ফিল্ড 1 প্রথম স্তরে এবং দ্বিতীয় স্তরের ক্ষেত্র 2 বাছাই করা উচিত।

যদি এই সিনট্যাক্সটি অজগরটিতে ব্যবহৃত হয়, তবে প্রথম স্তরে ফিল্ড 2 বাছাই করার সুযোগ রয়েছে। টিপল সহ কোনও ঝুঁকি নেই।

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

1
.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

পাইথন কী, দিকনির্দেশ ব্যবহার করে। আপনি উপরের উপায়টি ব্যবহার করতে পারেন।

সুতরাং আপনার ক্ষেত্রে আপনি এটি করতে পারেন

for post in db.posts.find().sort('entities.user_mentions.screen_name',pymongo.ASCENDING):
        print post

0

টিএলডিআর: প্রচলনের তুলনায় সমষ্টি পাইপলাইন দ্রুততর .find().sort()

এখন আসল ব্যাখ্যার দিকে এগিয়ে চলছে। মঙ্গোডিবিতে বাছাইয়ের ক্রিয়াকলাপ সম্পাদনের দুটি উপায় রয়েছে:

  1. ব্যবহার .find()এবং .sort()
  2. বা সমষ্টি পাইপলাইন ব্যবহার করে।

যেমন অনেক .find ()। সাজানো () সাজানোর কাজ সম্পাদন করার সহজ উপায়।

.sort([("field1",pymongo.ASCENDING), ("field2",pymongo.DESCENDING)])

তবে এটি সমষ্টি পাইপলাইনের তুলনায় একটি ধীর প্রক্রিয়া।

সমষ্টি পাইপলাইন পদ্ধতিতে আসছে। বাছাইয়ের উদ্দেশ্যে সরল সমষ্টি পাইপলাইন প্রয়োগের পদক্ষেপগুলি হ'ল:

  1. $ ম্যাচ (alচ্ছিক পদক্ষেপ)
  2. $ সাজানোর

দ্রষ্টব্য: আমার অভিজ্ঞতায়, সমষ্টি পাইপলাইন .find().sort()পদ্ধতির চেয়ে কিছুটা দ্রুত কাজ করে ।

সমষ্টি পাইপলাইনের একটি উদাহরণ এখানে।

db.collection_name.aggregate([{
    "$match": {
        # your query - optional step
    }
},
{
    "$sort": {
        "field_1": pymongo.ASCENDING,
        "field_2": pymongo.DESCENDING,
        ....
    }
}])

এই পদ্ধতিটি নিজে চেষ্টা করে দেখুন, গতির তুলনা করুন এবং আমাকে মন্তব্যে এই সম্পর্কে জানান।

সম্পাদনা করুন: allowDiskUse=Trueএকাধিক ক্ষেত্রে বাছাই করার সময় ব্যবহার করতে ভুলবেন না অন্যথায় এটি একটি ত্রুটি ফেলে দেবে throw


0

বলুন, আপনি 'created_on' ক্ষেত্র অনুসারে বাছাই করতে চান, তবে আপনি এটি এর মতো করতে পারেন,

.sort('{}'.format('created_on'), 1 if sort_type == 'asc' else -1)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.