MongoDB 101


#1

Mongodb drop duplicate

It used to be one command prior to mongodb v.3.0. However, dropDup is gone forever.

So it’s the best to just dump and db.dropDatabase() then mongorestore just data

> db.col.createIndex({"vehicle_id": 1, "gps_timestamp": -1}, {"unique": true})


$ mongorestore --collection <col> --db <db> dump/***/***.bson

Mongo $geo spatial

หาจุดรอบ ๆ อนุเสาวรีย์ 3 km

q = {'point': {'$geoWithin': {'$centerSphere': [ [100.538294, 13.764923], 3/6378.1] }}}

จริงๆ มันคือ

{
   <location field>: {
      $geoWithin: { $centerSphere: [ [ <x>, <y> ], <radius> ] }
   }
}

radius มันคือ เป็น radian คือ ถ้าจะใช้ miles ก็ x / 3,963.2 miles หรือ x / 6,378.1 kilometers

จริงๆ มันคือ The equatorial radius of the Earth is approximately 3,963.2 miles or 6,378.1 kilometers.

Note $centerSphere

Users

สร้าง User

db.createUser({user: 'sipp11', pwd: 'พาสเวิร์ดบ้านๆ', roles: ['dbAdmin', 'readWrite']})

ถ้า role ไม่เป็น object ก็จะเป็นของ database นั้นๆ

ให้สิทธิโดยที่ไม่ทับกับสิทธิเดิม

db.grantRolesToUser("sipp11", [{db: "prediction", "role": "readWrite"}, {db:"prediction": "role": "dbAdmin"}])

แก้ไขข้อมูล – ก็ขึ้นกับว่าใน object จะ update ไรบ้างก็ใส่ไป

db.updateUser("sipp11", {"pwd": "พาสเวิดใหม่", roles: [....]})

#2

Backup & Restore

backup

สามารถ backup แบบ query แค่เฉพาะที่ต้องการ ได้จาก -q และก็สามารถทำให้มันอยู่ใน file เดียวได้โดย --gzip --archive=xxxx.gz

mongodump --gzip --archive=silo-2017-wk-9.gz -d vehicle_log -c silo -q '{gps_timestamp:{$gte:ISODate("2017-02-25T17:00:00Z"),$lt:ISODate("2017-03-04T17:00:00Z")}}'

ถ้าจะต้องใส่ credential ก็ใส่ตามปกติ

mongodump -h 127.0.0.1 -u user1 -p password1 --authenticationDatabase=admin --gzip --archive=silo-2017-wk-9.gz -d vehicle_log -c silo -q '{gps_timestamp:{$gte:ISODate("2017-02-25T17:00:00Z"),$lt:ISODate("2017-03-04T17:00:00Z")}}'

restore

ถ้าจาก folder ก็ง่ายๆตามปกติ แต่ถ้าจาก archive ก็ต้องเพิ่มเล็กน้อยตามที่ backup

mongorestore --gzip --archive=silo-2017-wk-9.gz --db vehicle_log

#3

จัดการกับ /sys/kernel/mm/transparent_hugepage/enabled warning

install the sysfsutils package:

sudo apt install sysfsutils

and append a line with that setting to /etc/sysfs.conf:

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

แล้วก็ restart มันหรือ reboot ก็แล้วก็น่าจะช่วยให้ mongo ไม่โวยวายได้

# systemctl restart sysfsutils.service

#4

find a collection size

here is a discuss how it’s done

function getReadableFileSizeString(fileSizeInBytes) {

    var i = -1;
    var byteUnits = [' kB', ' MB', ' GB', ' TB', 'PB', 'EB', 'ZB', 'YB'];
    do {
        fileSizeInBytes = fileSizeInBytes / 1024;
        i++;
    } while (fileSizeInBytes > 1024);

    return Math.max(fileSizeInBytes, 0.1).toFixed(1) + byteUnits[i];
};
var collectionNames = db.getCollectionNames(), stats = [];
collectionNames.forEach(function (n) { stats.push(db.getCollection(n).stats()); });
stats = stats.sort(function(a, b) { return b['size'] - a['size']; });
for (var c in stats) { print(stats[c]['ns'] + ": " + getReadableFileSizeString(stats[c]['size']) + " (" + getReadableFileSizeString(stats[c]['storageSize']) + ")"); }