Mongodb saralash tartibi

Saralash uchun kalitlarning tartibini belgilashning bir usuli bormi?

Izohlarda qandaydir chalkashliklar borga o'xshaydi. Aniq bo'lish uchun, men o'sish yoki kamayish tartibi haqida so'ramayman. Men tartiblash ustuvorligini belgilashim mumkinligini so'rayman.

Masalan, men quyidagilar bo'yicha saralashni xohlayman:

  • mahkamlangan (mantiqiy)
  • ball (raqam)
  • eng yangi (Sana yoki ObjectId)

Shuning uchun; ... uchun; ... natijasida

  • faqat bir xil pinned qiymatiga ega hujjatlar score boʻyicha tartiblanadi va
  • faqat bir xil pinned va score bo'lgan hujjatlar newest bo'yicha saralanadimi?

Boshqa so'zlar bilan aytganda,

  • pinned qiymati boshqacha bo'lsa, score, newest hech qachon hisobga olinmasligi kerak (faqat pinned bo'yicha tartiblang)
  • score boshqacha bo'lsa, newest hech qachon hisobga olinmasligi kerak.

Masalan,

{ pinned: false, score:1, _id: new }
{ pinned: true, score:1, _id: oldest }
{ pinned: false, score:2, _id: old }

sifatida buyurtma berish kerak

{ pinned: true,  score: 1, _id: oldest }
{ pinned: false, score: 1, _id: new }
{ pinned: false, score: 2, _id: old }

person az_    schedule 25.04.2014    source manba
comment
IMHO, agar siz namunaviy ma'lumotlarni qo'ysangiz, odamlarga javob berish osonroq bo'ladi ...   -  person Askar    schedule 25.04.2014
comment
Men bu savolni murakkab deb o'ylamagan edim, lekin men misol qo'shdim.   -  person az_    schedule 25.04.2014
comment
Hujjatlarni tekshirdingizmi? docs.mongodb.org/manual/reference/method/cursor .sort/   -  person JohnnyHK    schedule 25.04.2014
comment
Menda bor, lekin mening savolimga javob beradigan hech narsa topa olmayapman. Hujjatlarda menga ko'rsata oladigan aniq narsa bormi?   -  person az_    schedule 25.04.2014
comment
sort() amal qiladimi? db.col.find({...}).sort({1-maydon: 1, 2-maydon: 1, ...})   -  person yaoxing    schedule 25.04.2014
comment
Men savolga mazmun qo'shdim. Umid qilamanki, bu narsalarni aniqlaydi. rahmat :)   -  person az_    schedule 25.04.2014
comment
Menimcha, siz so'ragan narsa @yaoxing sharhida bo'lgani kabi standart ko'p maydonli tartiblashdir. Siz sinab ko'rgan, ishlamagan narsa bormi?   -  person JohnnyHK    schedule 25.04.2014
comment
Menimcha, sizning yangilanishingizga ko'ra, sort() hali ham amal qiladi. db.col.find({...}).sort({qadamlangan: 1, ball: 1, _id: 1}); Siz so'ragan narsa sort() qanday ishlashini anglatadi.   -  person yaoxing    schedule 25.04.2014
comment
Men buni sinab ko'rdim va u ishlamayapti. Javascriptda ob'ekt ta'rifi bo'yicha xususiyatlarning tartibsiz to'plamidir. {pinned: 1, score: 1, _id: 1} === {_id: 1, pinned: 1, score: 1}. Mening holatimda, menda {pinned: -1, score: -1, _id: -1} bor, lekin u men xohlagan narsadan ko'ra qadalgan -› _id -› ball bo'yicha saralashni davom ettiradi (qadamlangan -› ball -› _id)   -  person az_    schedule 25.04.2014
comment
So'rovni qanday yozdingiz?   -  person yaoxing    schedule 25.04.2014
comment
Aynan sizda bo'lganidek.   -  person az_    schedule 25.04.2014
comment
Sinov uchun mongo qobig'idan foydalanasizmi? Mongo tartibida bir nechta joylarda ob'ektlarda muhim ahamiyatga ega. Saralash bandi shulardan biridir. Indeks spetsifikatsiyasi boshqa.   -  person Asya Kamsky    schedule 25.04.2014
comment
@AsyaKamsky bunga javob bera olasizmi? Bu yechimning ildiziga kiradigan yagona javob (mongodb Ecmascriptga amal qilmaydi)   -  person az_    schedule 25.04.2014
comment
JSON spetsifikatsiyasiga ko'ra, ha, bu tartibsiz to'plam bo'lishi kerak. Biroq, bu erda buyurtma muhim ahamiyatga ega.   -  person yaoxing    schedule 25.04.2014


Javoblar (2)


JSON hujjatlari tartibsiz bo'lsa-da, MongoDB-da buyurtma muhim bo'lgan bir nechta joylar mavjud. Esda tutish kerak bo'lgan eng muhimlari:

  • tartiblash tartibi
  • indeks spetsifikatsiyasi tartibi

Saralashni belgilaganingizda, tartiblash tartibi maydonlar tartibiga mos keladi, shuning uchun sizning holatingizda .sort({pinned:1,score:1,newest:1}) bo'ladi, siz hujjatlardagi misol.

Ba'zi operatsiyalar maydonlarni alohida tartibda kutishadi.

Agar siz ularga mos kelmoqchi bo'lsangiz, bu pastki hujjatlar uchun ham muhimdir (so'rovdagi yuqori darajadagi maydon tartibi muhim emas).

person Asya Kamsky    schedule 25.04.2014
comment
MongoDB qanday qilib bir xil ob'ektlarni {score:1,newest:1} va {newest:1,score:1} ajrata oladi - person Dmitri Zaitsev; 04.07.2015
comment
Ular bson ko'rinishida umuman bir xil emas. Ularga satrlar sifatida qarang, masalan - umuman bir xil emas va aniq belgilangan tartiblash tartibiga ega. - person Asya Kamsky; 04.07.2015
comment
Ularning satr (yoki bson) tasvirlari bir xil emas, balki JavaScript ob'ektlariga o'xshaydi - ular bir-biridan farq qilib bo'lmaydi, chunki kalit tartibi kafolatlanmagan. Shunday qilib, agar .sort(obj) ni JS ob'ekti obj ichida qilsam, maydonlar orasidagi tartibni qanday qilib ishonchli e'lon qilishni ko'rmayapman. - person Dmitri Zaitsev; 05.07.2015
comment
BTW Men Mongoning Bson va Json haqidagi tavsifini juda chalkash va tushunarsiz deb bilaman: mongodb.com/json-and- bsonning ta'kidlashicha, MongoDB JSON hujjatlarini BSON deb nomlangan ikkilik kodlangan formatda aks ettiradi. Shunday qilib, Bson faqat sahna ortida ishlatiladimi? - person Dmitri Zaitsev; 05.07.2015

Shuning uchun men sizning savolingizdagi kabi mongo shell bilan ba'zi bir namuna ma'lumotlarini kiritdim:

db.test.insert({ pinned: false, score:1, _id: "new" });
db.test.insert({ pinned: true, score:1, _id: "oldest" });
db.test.insert({ pinned: false, score:2, _id: "old" });

Uni saralashga harakat qiling:

db.test.find().sort({pinned: -1, score: 1, _id: 1})

Ma'lum bo'lishicha, natija quyidagicha:

{ "_id" : "oldest", "pinned" : true, "score" : 1 }
{ "_id" : "new", "pinned" : false, "score" : 1 }
{ "_id" : "old", "pinned" : false, "score" : 2 }

Siz xohlagan narsa shu emasmi?

EDIT: JavaScript JSON spetsifikatsiyasiga qat'iy rioya qilmasligini yodda tuting. masalan JSON spetsifikatsiyasi, shuningdek, mulk nomlari ", JavaScript" bilan iqtibos keltirilishi kerakligini aytadi, ammo siz iqtibos keltirishingiz shart emas yoki "" bilan iqtibos keltirishingiz mumkin.

person yaoxing    schedule 25.04.2014
comment
Yuqoridagi va bu erdagi javoblaringiz uchun tashakkur! Ma'lum bo'lishicha, mening so'rovimda xatolik bor edi - shuning uchun ham ball va _id ni e'tiborsiz qoldirgan. Yordamingiz uchun juda minnatdorman, lekin keyingi safar nima bilan birga sababini tushuntirib bersangiz foydaliroq bo'lardi. tahrir: va men ushbu sharhni yozishdan oldin uni qo'shganingizni ko'rmoqdaman. :+1: - person az_; 25.04.2014
comment
Nima uchun nima sababdan tushuntirmoqchiman. Qaysi qism sizni chalkashtirib yuborganini bilmadim. - person yaoxing; 25.04.2014
comment
Bu mongodb emas, balki spetsifikatsiyaga bo'ysunishni istamaydi, bu JavaScript emas. Mongo shell esa JavaScript V8 dvigateliga asoslangan. Javobimda yana bir misol qo'shdim. Menimcha, JavaScript-ni ishlatadigan odamlar bu hiyla haqida bilishadi va sizning u erda qolib ketganingizni bilmagan. - person yaoxing; 25.04.2014