jetty+mongodb 配置session外部數據庫存儲

monbgodb簡介 主頁 http://www.mongodb.org/html

oschina.net 介紹頁 http://www.oschina.net/p/mongodbjava

MongoDB是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。他支持的數據結構很是鬆散,是相似json的bjson格式,所以能夠存儲比較複雜的數據類型。Mongo最大的特色是他支持的查詢語言很是強大,其語法有點相似於面向對象的查詢語言,幾乎能夠實現相似關係數據庫單表查詢的絕大部分功能,並且還支持對數據創建索引。

它的特色是高性能、易部署、易使用,存儲數據很是方便。主要功能特性有:

面向集合存儲,易存儲對象類型的數據。
模式自由。
支持動態查詢。
支持徹底索引,包含內部對象。
支持查詢。
支持複製和故障恢復。
使用高效的二進制數據存儲,包括大型對象(如視頻等)。
自動處理碎片,以支持雲計算層次的擴展性
支持RUBY,PYTHON,JAVA,C++,PHP等多種語言。
文件存儲格式爲BSON(一種JSON的擴展)
可經過網絡訪問
所謂「面向集合」(Collenction-Orented),意思是數據被分組存儲在數據集中,被稱爲一個集合(Collenction)。每一個 集合在數據庫中都有一個惟一的標識名,而且能夠包含無限數目的文檔。集合的概念相似關係型數據庫(RDBMS)裏的表(table),不一樣的是它不須要定 義任何模式(schema)。
模式自由(schema-free),意味着對於存儲在mongodb數據庫中的文件,咱們不須要知道它的任何結構定義。若是須要的話,你徹底能夠把不一樣結構的文件存儲在同一個數據庫裏。
存儲在集合中的文檔,被存儲爲鍵-值對的形式。鍵用於惟一標識一個文檔,爲字符串類型,而值則能夠是各中複雜的文件類型。咱們稱這種存儲形式爲BSON(Binary Serialized dOcument Format)。

MongoDB服務端可運行在Linux、Windows或OS X平臺,支持32位和64位應用,默認端口爲27017。推薦運行在64位平臺,由於MongoDB

在32位模式運行時支持的最大文件尺寸爲2GB。

MongoDB把數據存儲在文件中(默認路徑爲:/data/db),爲提升效率使用內存映射文件進行管理。

在linux下先編譯安裝下吧。下載mongodb源碼 http://downloads.mongodb.org/src/mongodb-src-r2.4.4.tar.gznode

也能夠下載二進制的,有各類平臺的。80多MB,挺大的。建議下載二進制,由於源碼編譯 雖然眼前一亮,學到點新東西,可是編譯體積太大了。我來研究下源碼編譯mongodb吧。python

解壓mongodb-src-r2.4.4.tar.gz後,進入目錄,發現沒有configure或者Makefile,一時木了,不知所戳,姑搜索 編譯mongodb ,原來是這樣啊:linux

第一步  安裝SConsweb

Scons是一個Python寫的自動化構建工具,比傳統的GNU make更加簡便、可靠以及高效。
到http://sourceforge.net/projects/scons/files/scons/下載源碼壓縮包,解壓以後按照以下步驟進行安裝:sql

python setup.py install

Centos下也能夠yum install sconsmongodb

第二步 編譯Mongodb數據庫

進入mongodb源碼目錄json

scons all scons –prefix=/usr/local/mongodb install -j 8

若是想要頭文件和lib包,執行

scons –prefix=/usr/local/mongodb –full install -j 8

默認編譯完畢要花好久的時間,並且編譯體積太大了。查看下源碼目錄

[root@xen1 mongodb-src-r2.4.4]# du -sh * #去掉小於1M的了
15M     authTest
252M    bsondump
8.3G    build
4.0M    buildscripts
16M     clientTest
15M     firstExample6.2M    httpClientTest
5.5M    jstests
114M    mongo
252M    mongobridge
254M    mongod
253M    mongodump
252M    mongoexport
253M    mongofiles
253M    mongoimport
252M    mongooplog
252M    mongoperf
253M    mongorestore
182M    mongos
253M    mongostat
252M    mongotop
253M    perftest
15M     rsExample
15M     secondExample
71M     src
361M    test
15M     tutorial
15M     whereExample
xxK     ...
[root@xen1 mongodb-src-r2.4.4]# pwd
/root/mongodb-src-r2.4.4
[root@xen1 mongodb-src-r2.4.4]# du -sh .
13G     .
[root@xen1 mongodb-src-r2.4.4]#ll
總用量 4141620
-rw-rw-r--  1 root root     11358 6月   3 04:58 APACHE-2.0.txt
-rwxr-xr-x  1 root root  15207135 6月  20 12:28 authTest
-rwxr-xr-x  1 root root    543371 6月  20 12:29 bsondemo
-rwxr-xr-x  1 root root 264008056 6月  20 12:19 bsondump
drwxr-xr-x  3 root root      4096 6月  20 13:16 build
drwxrwxr-x  4 root root      4096 6月  20 11:27 buildscripts
-rwxr-xr-x  1 root root  15821236 6月  20 12:28 clientTest
-rw-rw-r--  1 root root      2948 6月   3 04:58 CONTRIBUTING.rst
drwxrwxr-x  2 root root      4096 6月   3 04:58 debian
drwxrwxr-x  3 root root      4096 6月   3 04:58 distsrc
drwxrwxr-x  2 root root      4096 6月   3 04:58 docs
-rw-rw-r--  1 root root     10808 6月   3 04:58 doxygenConfig
-rwxr-xr-x  1 root root  15211226 6月  20 12:28 firstExample
-rw-rw-r--  1 root root     34520 6月   3 04:58 GNU-AGPL-3.0.txt
-rwxr-xr-x  1 root root   6440685 6月  20 12:28 httpClientTest
drwxrwxr-x 22 root root     24576 6月   3 04:58 jstests
-rwxr-xr-x  1 root root 119133125 6月  20 11:42 mongo
-rw-rw-r--  1 root root       191 6月   3 04:58 mongo_astyle
-rwxr-xr-x  1 root root 264063672 6月  20 12:25 mongobridge
-rwxr-xr-x  1 root root 265599076 6月  20 12:01 mongod
-rwxr-xr-x  1 root root 264731994 6月  20 12:06 mongodump
-rwxr-xr-x  1 root root 264216054 6月  20 12:09 mongoexport
-rwxr-xr-x  1 root root 264568847 6月  20 12:18 mongofiles
-rwxr-xr-x  1 root root 264465437 6月  20 12:11 mongoimport
-rwxr-xr-x  1 root root 264239179 6月  20 12:16 mongooplog
-rwxr-xr-x  1 root root 263957415 6月  20 12:21 mongoperf
-rwxr-xr-x  1 root root 264674145 6月  20 12:07 mongorestore
-rwxr-xr-x  1 root root 190460179 6月  20 12:04 mongos
-rwxr-xr-x  1 root root 264779175 6月  20 12:12 mongostat
-rwxr-xr-x  1 root root 264125459 6月  20 12:14 mongotop
-rwxr-xr-x  1 root root 264976307 6月  20 12:23 perftest
-rwxrwxr-x  1 root root      1769 6月   3 04:58 README
drwxrwxr-x  2 root root      4096 6月   3 04:58 rpm
-rwxr-xr-x  1 root root  15304506 6月  20 12:28 rsExample
-rw-rw-r--  1 root root      2251 6月   3 04:58 SConscript.buildinfo
-rw-rw-r--  1 root root      6178 6月   3 04:58 SConscript.smoke
-rw-rw-r--  1 root root     38380 6月   3 04:58 SConstruct
-rwxr-xr-x  1 root root  15199859 6月  20 12:29 secondExample
drwxrwxr-x  3 root root      4096 6月  20 11:27 site_scons
drwxrwxr-x  4 root root      4096 6月   3 04:58 src
-rwxr-xr-x  1 root root 378493910 6月  20 12:41 test
-rwxr-xr-x  1 root root  15299544 6月  20 12:29 tutorial
-rw-rw-r--  1 root root       254 6月   3 04:58 valgrind.suppressions
-rwxr-xr-x  1 root root  15257921 6月  20 12:29 whereExample
-rw-rw-r--  1 root root       448 6月   3 04:58 win2008plus.props
[root@xen1 mongodb-src-r2.4.4]# 
View Code

scons後面跟的參數 -j 8 是8線程同時編譯,加快編譯速度,其餘參數未知,從其餘地方引用過來的。好像 直接scons -j 8  應該也能夠編譯。可是編譯出來的mongod 文件太大了,確定有優化的參數,暫時不知道。查看了mongodb的文檔,也沒看到如何編譯,都是二進制安裝的。我無語,哪就不研究源碼編譯了。

mongodb官方的 yum 源,下載到 yum.repos.d/10gen.repo ,之後就能夠安裝二進制包了。

# /etc/yum.repos.d/10gen.repo

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
#baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/i686
gpgcheck=0
enabled=1
yum install mongo-10gen mongo-10gen-server 就能夠安裝最新版的 mongodb 了。包括init.d服務啓動文件和配置文件。
啓動文件mongod複製過來 參考一下。
#!/bin/bash

# mongod - Startup script for mongod

# chkconfig: 35 85 15
# description: Mongo is a scalable, document-oriented database.
# processname: mongod
# config: /etc/mongod.conf
# pidfile: /var/run/mongo/mongod.pid

. /etc/rc.d/init.d/functions

# things from mongod.conf get there by mongod reading it


# NOTE: if you change any OPTIONS here, you get what you pay for:
# this script assumes all options are in the config file.
CONFIGFILE="/etc/mongod.conf"
OPTIONS=" -f $CONFIGFILE"
SYSCONFIG="/etc/sysconfig/mongod"

# FIXME: 1.9.x has a --shutdown flag that parses the config file and
# shuts down the correct running pid, but that's unavailable in 1.8
# for now.  This can go away when this script stops supporting 1.8.
DBPATH=`awk -F= '/^dbpath=/{print $2}' "$CONFIGFILE"`
PIDFILE=`awk -F= '/^dbpath\s=\s/{print $2}' "$CONFIGFILE"`
mongod=${MONGOD-/usr/bin/mongod}

MONGO_USER=mongod
MONGO_GROUP=mongod

if [ -f "$SYSCONFIG" ]; then
    . "$SYSCONFIG"
fi

# Handle NUMA access to CPUs (SERVER-3574)
# This verifies the existence of numactl as well as testing that the command works
NUMACTL_ARGS="--interleave=all"
if which numactl >/dev/null 2>/dev/null && numactl $NUMACTL_ARGS ls / >/dev/null 2>/dev/null
then
    NUMACTL="numactl $NUMACTL_ARGS"
else
    NUMACTL=""
fi

start()
{
  echo -n $"Starting mongod: "
  daemon --user "$MONGO_USER" $NUMACTL $mongod $OPTIONS
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mongod
}

stop()
{
  echo -n $"Stopping mongod: "
  killproc -p "$PIDFILE" -d 300 /usr/bin/mongod
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mongod
}

restart () {
    stop
    start
}

ulimit -n 12000
RETVAL=0

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart|reload|force-reload)
    restart
    ;;
  condrestart)
    [ -f /var/lock/subsys/mongod ] && restart || :
    ;;
  status)
    status $mongod
    RETVAL=$?
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    RETVAL=1
esac

exit $RETVAL
View Code

還有配置文件/etc/mongod.conf

# mongo.conf

#where to log
logpath=/var/log/mongo/mongod.log

logappend=true

# fork and run in background
fork = true

#port = 27017

dbpath=/var/lib/mongo

# location of pidfile
pidfilepath = /var/run/mongodb/mongod.pid

# Disables write-ahead journaling
# nojournal = true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
#auth = true

# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog = 0

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#nohttpinterface = true

# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true

# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true

# Disable data file preallocation.
#noprealloc = true

# Specify .ns file size for new databases.
# nssize = <size>

# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com
View Code

service mongod start

service mongod status

就開啓了服務了。

打開瀏覽器 輸入 http://IP:27017 顯示:

You are trying to access MongoDB on the native driver port. For http diagnostic access, add 1000 to the port number

 按照提示,將端口號增長1000 ,打開 http://IP:28017 將會顯示一個mongod服務的概述吧。此功能 或許應該關閉。

 

測試Insert update delete select 操做

輸入mongo 便可打開客戶端,鏈接默認端口 默認本機的mongodb的服務。

輸入

db.test.save( { a: 1 } )
db.test.find()

 

 第二階段 配置jetty與mongodb之間的鏈接

按照官方文檔,http://wiki.eclipse.org/Jetty/Tutorial/MongoDB_Session_Clustering 

我把一些配置 加入到jetty.xml中,重啓jetty 報錯。大概是 org.eclipse.jetty.nosql.mongodb.* 不知道在哪裏,後來我發現:

我發現eclipse的jetty網頁 是十分讓人噁心的,至少是我。

在 http://download.eclipse.org/jetty/stable-8/apidocs/ 明明有nosql.mongodb 的javadoc http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/nosql/mongodb/MongoSessionManager.html

可是我從 http://download.eclipse.org/jetty/ 下載的stable-8 裏面的javadoc中卻沒有這塊內容,爲何神奇的消失了?後來看到老外的一個文章 

http://www.jamesward.com/2011/11/30/using-mongodb-for-a-java-web-apps-httpsession

使用maven來下載jetty插件,而後再%HOME%\.m2\repository\org\eclipse\jetty 出現了 jetty-nosql jetty-nosql-8.0.3.v20111011.jar ,終於看到了這個包,裏面有nosql\mongodb 了。我就奇怪了,eclipse的jetty網站下載jetty 爲何沒有jetty-nosql呢?若是是第三方,哪爲何在apidoc裏面還有nosql的javadoc呢?

噁心。噁心eclipse。

 好吧,繼續配置jetty與mongodb:

jetty-nosql 下載:http://repo1.maven.org/maven2/org/eclipse/jetty/jetty-nosql/8.1.11.v20130520/

還有一個mongodb-java-driver:http://repo1.maven.org/maven2/org/mongodb/mongo-java-driver/2.7.3/

 具體 有關mongodb 的java驅動 看: http://docs.mongodb.org/ecosystem/tutorial/getting-started-with-java-driver/

而後我開始了另外一端苦逼的研究,把這倆jar文件放到哪裏呢?我放到/root/下,而後設置CLASSPATH,添加了這兩個jar的絕對路徑【後來證實個人作法不被支持,繼續看吧】,修改$JETTY_HOME/start.ini 加入了一個  配置選項:

etc/jetty-nosql.xml

而後 touch etc/jetty-nosql.xml ,裏面內容以下: 

<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">

<Configure id="Server" class="org.eclipse.jetty.server.Server">

<Set name="sessionIdManager">
        <New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager">
                <Arg>
                        <Ref id="Server" />
                </Arg>
                <Set name="workerName">fred</Set>
                <Set name="ScavengePeriod">60</Set>

        </New>
</Set>
<Call name="setAttribute">
        <Arg>mongoIdMgr</Arg>
        <Arg>
                <Ref id="mongoIdMgr"/>
        </Arg>
</Call>



<New id="mongodb" class="com.mongodb.Mongo">
      <Arg>
        <New class="java.util.ArrayList">
          <Call name="add">
            <Arg>
              <New class="com.mongodb.ServerAddress">
                <Arg type="java.lang.String">localhost</Arg>
                <Arg type="int">27017</Arg>
              </New>
            </Arg>
          </Call>
          <!-- Add more Call statements here as desired -->
         </New>
      </Arg>

      <Call name="getDB">
        <Arg>HttpSessions</Arg>
        <Call id="sessionDocument" name="getCollection">
          <Arg>sessions</Arg>
        </Call>
      </Call>
      <!-- If you want to configure Jetty to be able to read through the slaves, call the following: -->
      <Call name="slaveOk"/>
 </New>

    <Set name="sessionIdManager">
      <New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager">
        <Arg>
          <Ref id="Server"/>
        </Arg>
        <Arg>
          <Ref id="sessionDocument"/>
        </Arg>
        <Set name="workerName">fred</Set>
        <Set name="scavengePeriod">60</Set>
      </New>
    </Set>


</Configure>

這個看起來是xml,其實確實是xml,可是裏面的內容不是隨便搞的,其會映射爲一些java代碼的。隨便寫點內容,jetty就會報異常的,我service jetty restart 報錯爲:

[root@localhost jetty]# service  jetty restart
Stopping Jetty: OK
Starting Jetty: 2013-06-22 11:35:20.287:WARN:oejx.XmlConfiguration:Config error at <Set name="sessionIdManager">|?<New id="mongoIdMgr" class="org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager"><Arg>|???<Ref id="Server"/>|??</Arg><Set name="workerName">fred</Set><Set name="scavengeInterval">60</Set></New>|</Set> java.lang.ClassNotFoundException: org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager
java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.eclipse.jetty.start.Main.invokeMain(Main.java:473)
        at org.eclipse.jetty.start.Main.start(Main.java:615)
        at org.eclipse.jetty.start.Main.main(Main.java:96)
Caused by: java.lang.ClassNotFoundException: org.eclipse.jetty.nosql.mongodb.MongoSessionIdManager
        at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
        at org.eclipse.jetty.util.Loader.loadClass(Loader.java:100)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.nodeClass(XmlConfiguration.java:354)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.newObj(XmlConfiguration.java:754)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.itemValue(XmlConfiguration.java:1126)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.value(XmlConfiguration.java:1029)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.set(XmlConfiguration.java:422)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:384)
        at org.eclipse.jetty.xml.XmlConfiguration$JettyXmlConfiguration.configure(XmlConfiguration.java:343)
        at org.eclipse.jetty.xml.XmlConfiguration.configure(XmlConfiguration.java:296)
        at org.eclipse.jetty.xml.XmlConfiguration$1.run(XmlConfiguration.java:1247)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.eclipse.jetty.xml.XmlConfiguration.main(XmlConfiguration.java:1182)
        ... 7 more

Usage: java -jar start.jar [options] [properties] [configs]
       java -jar start.jar --help  # for more information

FAILED Sat Jun 22 11:35:23 CST 2013
[root@localhost jetty]#

沒有找到類,哪就是我設置的jar的classpath竟然沒用,對於通常的java程序是管用的。而後研究,java -jar start.jar --help 有--list-options和--list-config 其都是在start.jar裏面一個start.config的文件裏面的配置,查看了下,裏面的OPTIONS 其實就是指定的一些jar包,而後配合jetty-XXX.xml,就能夠實現這一方面的功能了,好比jetty-ajp-VERSION.jar和jetty-ajp.xml,我在start.ini裏面加入OPTIONS ajp,和etc/jetty-ajp.xml 纔有了ajp的功能。

那麼個人mongodb-java-driver.jar和jetty-nosql.jar放到哪裏呢?難道要我修改start.jar裏面的配置文件再放入,jetty,java,你有必要這麼麻煩麼?配置文件,你有必要弄的這樣個性化,不具有普及型麼?後來才發現,原來 jetty額外的包(jar文件)應該放到jetty目錄的/lib/ext目錄下,而不是/lib目錄下。

你妹的,真方便,把兩個jar放入lib/ext 再開啓服務,果真OK,找到了這些個jar了,搜索jar原本是jvm乾的事情,用classpath就能夠作到,你非要逆天而行,本身搜索jar,還不接受jvm搜索jar的classpath路徑,好吧,我認輸,java有太多的這樣的事情了。

 

測試 session是否存儲到mongodb上,以及mongodb的分佈式配置

TODO。。。

 

參考連接:

http://www.blogjava.net/xiaomage234/archive/2012/07/18/383388.html

http://www.scons.org/doc/production/HTML/scons-user/index.html

http://www.scons.org/doc/production/HTML/scons-man.html

http://cn.docs.mongodb.org/manual/

http://docs.mongodb.org/manual/

http://docs.mongodb.org/manual/tutorial/install-mongodb-on-red-hat-centos-or-fedora-linux/

http://www.cnblogs.com/lipan/archive/2011/03/08/1966463.html mongodb 系列文章

 

MongoDB與sql語句對照表

SQL Statement  Mongo Query Language Statement 
CREATE TABLE USERS (a Number, b Number)
implicit; can be done explicitly
INSERT INTO USERS VALUES(1,1)
db.users.insert({a:1,b:1})
SELECT a,b FROM users
db.users.find({}, {a:1,b:1})
SELECT * FROM users
db.users.find()
SELECT * FROM users WHERE age=33
db.users.find({age:33})
SELECT a,b FROM users WHERE age=33
db.users.find({age:33}, {a:1,b:1})
SELECT * FROM users WHERE age=33 ORDER BY name
db.users.find({age:33}).sort({name:1})
SELECT * FROM users WHERE age>33
db.users.find({'age':{$gt:33}})})
SELECT * FROM users WHERE age<33
db.users.find({'age':{$lt:33}})})
SELECT * FROM users WHERE name LIKE "%Joe%"
db.users.find({name:/Joe/})
SELECT * FROM users WHERE name LIKE "Joe%"
db.users.find({name:/^Joe/})
SELECT * FROM users WHERE age>33 AND age<=40
db.users.find({'age':{$gt:33,$lte:40}})})
SELECT * FROM users ORDER BY name DESC
db.users.find().sort({name:-1})
CREATE INDEX idx_name ON users(name)
db.users.ensureIndex({name:1})
CREATE INDEX idx_name ON users(name,ts DESC)
db.users.ensureIndex({name:1,ts:-1})
SELECT * FROM users WHERE a=1 and b='q'
db.users.find({a:1,b:'q'})
SELECT * FROM users LIMIT 10 SKIP 20
db.users.find().limit(10).skip(20)
SELECT * FROM users WHERE a=1 or b=2
db.users.find( { $or : [ { a : 1 } , { b : 2 } ] } )
SELECT * FROM users LIMIT 1
db.users.findOne()
EXPLAIN SELECT * FROM users WHERE z=3
db.users.find({z:3}).explain()
SELECT DISTINCT last_name FROM users
db.users.distinct('last_name')
SELECT COUNT(*y) FROM users
db.users.count()
SELECT COUNT(*y) FROM users where AGE > 30
db.users.find({age: {'$gt': 30}}).count()
SELECT COUNT(AGE) from users
db.users.find({age: {'$exists': true}}).count()
UPDATE users SET a=1 WHERE b='q'
db.users.update({b:'q'}, {$set:{a:1}}, false, true)
UPDATE users SET a=a+2 WHERE b='q'
db.users.update({b:'q'}, {$inc:{a:2}}, false, true)
DELETE FROM users WHERE z="abc"
db.users.remove({z:'abc'});
相關文章
相關標籤/搜索