《MongoDB极简教程》第二章 MongoDB 基本命令(Shell)

MongoDB的所有请求都以命令的形式发出,支持的命令列表参考Database Commands

The mongo Shell:
https://docs.mongodb.com/manual/mongo/

db是mongoDB的全局变量,持有当前数据库schema的引用。
首次进入客户端shell,敲入命令db

> db
test

看看当前数据库server的状态

> db.serverStatus()
{
    "host" : "jacks-MacBook-Air.local",
    "advisoryHostFQDNs" : [
        "jacks-macbook-air.local"
    ],
    "version" : "3.2.4",
    "process" : "mongod",
    "pid" : NumberLong(68),
    "uptime" : 616301,
    "uptimeMillis" : NumberLong(616300555),
    "uptimeEstimate" : 35411,
    "localTime" : ISODate("2017-03-20T05:42:48.260Z"),
    "asserts" : {
        "regular" : 0,
        "warning" : 0,
        "msg" : 0,
        "user" : 0,
        "rollovers" : 0
    },
    "connections" : {
        "current" : 2,
        "available" : 3274,
        "totalCreated" : NumberLong(6)
    },
    "extra_info" : {
        "note" : "fields vary by platform",
        "page_faults" : 4993
    },
    "globalLock" : {
        "totalTime" : NumberLong("616300534000"),
        "currentQueue" : {
            "total" : 0,
            "readers" : 0,
            "writers" : 0
        },
        "activeClients" : {
            "total" : 9,
            "readers" : 0,
            "writers" : 0
        }
    },
    "locks" : {
        "Global" : {
            "acquireCount" : {
                "r" : NumberLong(1471174),
                "w" : NumberLong(2920),
                "W" : NumberLong(4)
            }
        },
        "Database" : {
            "acquireCount" : {
                "r" : NumberLong(734121),
                "w" : NumberLong(2901),
                "R" : NumberLong(4),
                "W" : NumberLong(19)
            }
        },
        "Collection" : {
            "acquireCount" : {
                "r" : NumberLong(774729),
                "w" : NumberLong(2901)
            }
        },
        "Metadata" : {
            "acquireCount" : {
                "w" : NumberLong(1)
            }
        }
    },
    "network" : {
        "bytesIn" : NumberLong(1529),
        "bytesOut" : NumberLong(6719),
        "numRequests" : NumberLong(21)
    },
    "opcounters" : {
        "insert" : 0,
        "query" : 1,
        "update" : 0,
        "delete" : 0,
        "getmore" : 0,
        "command" : 22
    },
    "opcountersRepl" : {
        "insert" : 0,
        "query" : 0,
        "update" : 0,
        "delete" : 0,
        "getmore" : 0,
        "command" : 0
    },
    "storageEngine" : {
        "name" : "wiredTiger",
        "supportsCommittedReads" : true
    },
    "wiredTiger" : {
        "uri" : "statistics:",
        "LSM" : {
            "sleep for LSM checkpoint throttle" : 0,
            "sleep for LSM merge throttle" : 0,
            "rows merged in an LSM tree" : 0,
            "application work units currently queued" : 0,
            "merge work units currently queued" : 0,
            "tree queue hit maximum" : 0,
            "switch work units currently queued" : 0,
            "tree maintenance operations scheduled" : 0,
            "tree maintenance operations discarded" : 0,
            "tree maintenance operations executed" : 0
        },
        "async" : {
            "number of allocation state races" : 0,
            "number of operation slots viewed for allocation" : 0,
            "current work queue length" : 0,
            "number of flush calls" : 0,
            "number of times operation allocation failed" : 0,
            "maximum work queue length" : 0,
            "number of times worker found no work" : 0,
            "total allocations" : 0,
            "total compact calls" : 0,
            "total insert calls" : 0,
            "total remove calls" : 0,
            "total search calls" : 0,
            "total update calls" : 0
        },
        "block-manager" : {
            "mapped bytes read" : 0,
            "bytes read" : 446464,
            "bytes written" : 163840,
            "mapped blocks read" : 0,
            "blocks pre-loaded" : 25,
            "blocks read" : 86,
            "blocks written" : 25
        },
        "cache" : {
            "tracked dirty bytes in the cache" : 0,
            "tracked bytes belonging to internal pages in the cache" : 21407,
            "bytes currently in the cache" : 237704,
            "tracked bytes belonging to leaf pages in the cache" : 216297,
            "maximum bytes configured" : 4294967296,
            "tracked bytes belonging to overflow pages in the cache" : 0,
            "bytes read into cache" : 174182,
            "bytes written from cache" : 110151,
            "pages evicted by application threads" : 0,
            "checkpoint blocked page eviction" : 0,
            "unmodified pages evicted" : 0,
            "page split during eviction deepened the tree" : 0,
            "modified pages evicted" : 0,
            "pages selected for eviction unable to be evicted" : 0,
            "pages evicted because they exceeded the in-memory maximum" : 0,
            "pages evicted because they had chains of deleted items" : 0,
            "failed eviction of pages that exceeded the in-memory maximum" : 0,
            "hazard pointer blocked page eviction" : 0,
            "internal pages evicted" : 0,
            "maximum page size at eviction" : 0,
            "eviction server candidate queue empty when topping up" : 0,
            "eviction server candidate queue not empty when topping up" : 0,
            "eviction server evicting pages" : 0,
            "eviction server populating queue, but not evicting pages" : 0,
            "eviction server unable to reach eviction goal" : 0,
            "internal pages split during eviction" : 0,
            "leaf pages split during eviction" : 0,
            "pages walked for eviction" : 0,
            "eviction worker thread evicting pages" : 0,
            "in-memory page splits" : 0,
            "in-memory page passed criteria to be split" : 0,
            "lookaside table insert calls" : 0,
            "lookaside table remove calls" : 0,
            "percentage overhead" : 8,
            "tracked dirty pages in the cache" : 0,
            "pages currently held in the cache" : 47,
            "pages read into cache" : 43,
            "pages read into cache requiring lookaside entries" : 0,
            "pages written from cache" : 13,
            "page written requiring lookaside records" : 0,
            "pages written requiring in-memory restoration" : 0
        },
        "connection" : {
            "pthread mutex condition wait calls" : 6755705,
            "files currently open" : 27,
            "memory allocations" : 2046182,
            "memory frees" : 2044869,
            "memory re-allocations" : 531046,
            "total read I/Os" : 936,
            "pthread mutex shared lock read-lock calls" : 266348,
            "pthread mutex shared lock write-lock calls" : 67963,
            "total write I/Os" : 39
        },
        "cursor" : {
            "cursor create calls" : 70,
            "cursor insert calls" : 25,
            "cursor next calls" : 3113,
            "cursor prev calls" : 2919,
            "cursor remove calls" : 1,
            "cursor reset calls" : 171656,
            "cursor restarted searches" : 0,
            "cursor search calls" : 168752,
            "cursor search near calls" : 2902,
            "truncate calls" : 0,
            "cursor update calls" : 0
        },
        "data-handle" : {
            "connection data handles currently active" : 24,
            "session dhandles swept" : 0,
            "session sweep attempts" : 21,
            "connection sweep dhandles closed" : 0,
            "connection sweep candidate became referenced" : 0,
            "connection sweep dhandles removed from hash list" : 3,
            "connection sweep time-of-death sets" : 22,
            "connection sweeps" : 17279
        },
        "log" : {
            "total log buffer size" : 33554432,
            "log bytes of payload data" : 4111,
            "log bytes written" : 5504,
            "yields waiting for previous log file close" : 0,
            "total size of compressed records" : 3967,
            "total in-memory size of compressed records" : 6785,
            "log records too small to compress" : 6,
            "log records not compressed" : 0,
            "log records compressed" : 5,
            "log flush operations" : 969556,
            "maximum log file size" : 104857600,
            "pre-allocated log files prepared" : 2,
            "number of pre-allocated log files to create" : 2,
            "pre-allocated log files not ready and missed" : 1,
            "pre-allocated log files used" : 0,
            "log release advances write LSN" : 5,
            "records processed by log scan" : 10,
            "log scan records requiring two reads" : 4,
            "log scan operations" : 3,
            "consolidated slot closures" : 2327947,
            "written slots coalesced" : 0,
            "logging bytes consolidated" : 5120,
            "consolidated slot joins" : 11,
            "consolidated slot join races" : 0,
            "busy returns attempting to switch slots" : 0,
            "consolidated slot join transitions" : 2327947,
            "consolidated slot unbuffered writes" : 0,
            "log sync operations" : 7,
            "log sync_dir operations" : 1,
            "log server thread advances write LSN" : 2,
            "log write operations" : 11,
            "log files manually zero-filled" : 0
        },
        "reconciliation" : {
            "pages deleted" : 0,
            "fast-path pages deleted" : 0,
            "page reconciliation calls" : 12,
            "page reconciliation calls for eviction" : 0,
            "split bytes currently awaiting free" : 0,
            "split objects currently awaiting free" : 0
        },
        "session" : {
            "open cursor count" : 20,
            "open session count" : 16
        },
        "thread-yield" : {
            "page acquire busy blocked" : 0,
            "page acquire eviction blocked" : 0,
            "page acquire locked blocked" : 0,
            "page acquire read blocked" : 0,
            "page acquire time sleeping (usecs)" : 0
        },
        "transaction" : {
            "transaction begins" : 11617,
            "transaction checkpoints" : 2900,
            "transaction checkpoint generation" : 2900,
            "transaction checkpoint currently running" : 0,
            "transaction checkpoint max time (msecs)" : 595,
            "transaction checkpoint min time (msecs)" : 3,
            "transaction checkpoint most recent time (msecs)" : 4,
            "transaction checkpoint total time (msecs)" : 12083,
            "transactions committed" : 3,
            "transaction failures due to cache overflow" : 0,
            "transaction range of IDs currently pinned by a checkpoint" : 0,
            "transaction range of IDs currently pinned" : 0,
            "transaction range of IDs currently pinned by named snapshots" : 0,
            "transactions rolled back" : 11614,
            "number of named snapshots created" : 0,
            "number of named snapshots dropped" : 0,
            "transaction sync calls" : 0
        },
        "concurrentTransactions" : {
            "write" : {
                "out" : 0,
                "available" : 128,
                "totalTickets" : 128
            },
            "read" : {
                "out" : 0,
                "available" : 128,
                "totalTickets" : 128
            }
        }
    },
    "writeBacksQueued" : false,
    "mem" : {
        "bits" : 64,
        "resident" : 7,
        "virtual" : 2513,
        "supported" : true,
        "mapped" : 0,
        "mappedWithJournal" : 0
    },
    "metrics" : {
        "commands" : {
            "buildInfo" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(2)
            },
            "getLog" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(2)
            },
            "isMaster" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(10)
            },
            "listCollections" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(1)
            },
            "listDatabases" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(2)
            },
            "replSetGetStatus" : {
                "failed" : NumberLong(2),
                "total" : NumberLong(2)
            },
            "serverStatus" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(1)
            },
            "whatsmyuri" : {
                "failed" : NumberLong(0),
                "total" : NumberLong(2)
            }
        },
        "cursor" : {
            "timedOut" : NumberLong(0),
            "open" : {
                "noTimeout" : NumberLong(0),
                "pinned" : NumberLong(0),
                "total" : NumberLong(0)
            }
        },
        "document" : {
            "deleted" : NumberLong(0),
            "inserted" : NumberLong(0),
            "returned" : NumberLong(0),
            "updated" : NumberLong(0)
        },
        "getLastError" : {
            "wtime" : {
                "num" : 0,
                "totalMillis" : 0
            },
            "wtimeouts" : NumberLong(0)
        },
        "operation" : {
            "fastmod" : NumberLong(0),
            "idhack" : NumberLong(0),
            "scanAndOrder" : NumberLong(0),
            "writeConflicts" : NumberLong(0)
        },
        "queryExecutor" : {
            "scanned" : NumberLong(0),
            "scannedObjects" : NumberLong(0)
        },
        "record" : {
            "moves" : NumberLong(0)
        },
        "repl" : {
            "executor" : {
                "counters" : {
                    "eventCreated" : 0,
                    "eventWait" : 0,
                    "cancels" : 0,
                    "waits" : 0,
                    "scheduledNetCmd" : 0,
                    "scheduledDBWork" : 0,
                    "scheduledXclWork" : 0,
                    "scheduledWorkAt" : 0,
                    "scheduledWork" : 0,
                    "schedulingFailures" : 0
                },
                "queues" : {
                    "networkInProgress" : 0,
                    "dbWorkInProgress" : 0,
                    "exclusiveInProgress" : 0,
                    "sleepers" : 0,
                    "ready" : 0,
                    "free" : 0
                },
                "unsignaledEvents" : 0,
                "eventWaiters" : 0,
                "shuttingDown" : false,
                "networkInterface" : "NetworkInterfaceASIO inShutdown: 0"
            },
            "apply" : {
                "batches" : {
                    "num" : 0,
                    "totalMillis" : 0
                },
                "ops" : NumberLong(0)
            },
            "buffer" : {
                "count" : NumberLong(0),
                "maxSizeBytes" : 268435456,
                "sizeBytes" : NumberLong(0)
            },
            "network" : {
                "bytes" : NumberLong(0),
                "getmores" : {
                    "num" : 0,
                    "totalMillis" : 0
                },
                "ops" : NumberLong(0),
                "readersCreated" : NumberLong(0)
            },
            "preload" : {
                "docs" : {
                    "num" : 0,
                    "totalMillis" : 0
                },
                "indexes" : {
                    "num" : 0,
                    "totalMillis" : 0
                }
            }
        },
        "storage" : {
            "freelist" : {
                "search" : {
                    "bucketExhausted" : NumberLong(0),
                    "requests" : NumberLong(0),
                    "scanned" : NumberLong(0)
                }
            }
        },
        "ttl" : {
            "deletedDocuments" : NumberLong(0),
            "passes" : NumberLong(2901)
        }
    },
    "ok" : 1
}

``

看看有哪些库

show dbs;
admin 0.000GB
local 0.000GB
restfiddle 0.001GB


#use命令

MongoDB 用 

use + 数据库名称


的方式来创建数据库。use 会创建一个新的数据库,如果该数据库存在,则返回这个数据库。」



例子1. 創建 root 用戶名密碼

####Step1.首先,切换到admin db (schema):

use admin;
switched to db admin



####Step2.在該 schema 下面設置用戶名,密碼:

db.createUser({ user: "root",pwd: "root",customData:{name:"root"},roles:[{ role: "userAdminAnyDatabase",db: "admin" }]})
Successfully added user: {
"user" : "root",
"customData" : {
"name" : "root"
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
db.auth('root','root')
1


####Step3.给restfiddle库权限


var r =
{
"_id": "restfiddle.root",
"user": "root",
"db": "restfiddle",
"credentials": {
"SCRAM-SHA-1": {
"iterationCount": 10000,
"salt": "riZjwBYHvkcV99typ8BRMA==",
"storedKey": "E2QOruLrBNXD1mlQTX0TQogL/ws=",
"serverKey": "JEQhfa/5x7+aNzKrFvKRkctXXfQ="
}
},
"roles": [
{
"role": "dbOwner",
"db": "restfiddle"
},
{
"role": "read",
"db": "restfiddle"
},
{
"role": "readWrite",
"db": "restfiddle"
}
]
}

db.system.users.insert(r)




#[Database Operations](https://docs.mongodb.com/manual/reference/command/?spm=5176.100239.blogcont68925.15.OLu8c1#database-operations)


#查看数据库的文档(json document),集合(collection)结构

我们切换到库use restfiddle,看一下当前库的状态:

use restfiddle;
switched to db restfiddle
db.stats()
{
"db" : "restfiddle",
"collections" : 14,
"objects" : 298,
"avgObjSize" : 362.18120805369125,
"dataSize" : 107930,
"storageSize" : 372736,
"numExtents" : 0,
"indexes" : 15,
"indexSize" : 339968,
"ok" : 1
}


查看库restfiddle有哪些集合:

db
restfiddle
show collections;
EntityAuth
activityLog
baseNode

config
conversation
httpRequestHeader
oAuth2
project
rfRequest
rfResponse
runnerLog
tag
user
workspace


查看user集合里面有哪些json document:

db.user.find();
{ "_id" : ObjectId("575fa8a2ba637304fffbad5e"), "_class" : "com.restfiddle.entity.User", "password" : "$2a$10$JzistJ7qIP80KMYwSqSu7uShUGn4bg/m.u0/51HcKHVIui/URgbTi", "email" : "rf@example.com", "name" : "RF Admin", "status" : "ACTIVE", "version" : NumberLong(0) }
{ "_id" : ObjectId("575fa8a2ba637304fffbad5f"), "_class" : "com.restfiddle.entity.User", "password" : "$2a$10$eyrBDJyNepEPsX3qTUveqeKNxYFq/nQq4sTixY/nRZhFynTW9izxm", "email" : "anuja@example.com", "name" : "Anuja Kumar", "status" : "ACTIVE", "version" : NumberLong(0) }
db.user.find().pretty();
{
"_id" : ObjectId("575fa8a2ba637304fffbad5e"),
"_class" : "com.restfiddle.entity.User",
"password" : "$2a$10$JzistJ7qIP80KMYwSqSu7uShUGn4bg/m.u0/51HcKHVIui/URgbTi",
"email" : "rf@example.com",
"name" : "RF Admin",
"status" : "ACTIVE",
"version" : NumberLong(0)
}
{
"_id" : ObjectId("575fa8a2ba637304fffbad5f"),
"_class" : "com.restfiddle.entity.User",
"password" : "$2a$10$eyrBDJyNepEPsX3qTUveqeKNxYFq/nQq4sTixY/nRZhFynTW9izxm",
"email" : "anuja@example.com",
"name" : "Anuja Kumar",
"status" : "ACTIVE",
"version" : NumberLong(0)
}


我们看到,json的pretty()函数使得输出更好阅读。

#主键_id唯一性

我们往user集里面插入一条记录:

var newUser = {
... "_id" : ObjectId("575fa8a2ba637304fffbad5e"),
... "_class" : "com.restfiddle.entity.User",
... "password" : "$2a$10$JzistJ7qIP80KMYwSqSu7uShUGn4bg/m.u0/51HcKHVIui/URgbTi",
... "email" : "rf@example.com",
... "name" : "RF Admin",
... "status" : "ACTIVE",
... "version" : NumberLong(0)
... }

db.user.insert(newUser)
WriteResult({
"nInserted" : 0,

"writeError" : {
    "code" : 11000,
    "errmsg" : "E11000 duplicate key error collection: restfiddle.user index: _id_ dup key: { : ObjectId('575fa8a2ba637304fffbad5e') }"
}

})


看到了,提示我们:

> "E11000 duplicate key error collection: restfiddle.user index: _id_ dup key: { : ObjectId('575fa8a2ba637304fffbad5e') }"

这个提示,告诉我们,在mongoDB中,集合里面的文档json的主键_id是唯一的。



#插入一条json

db.user.find();
{ "_id" : ObjectId("575fa8a2ba637304fffbad5e"), "_class" : "com.restfiddle.entity.User", "password" : "$2a$10$JzistJ7qIP80KMYwSqSu7uShUGn4bg/m.u0/51HcKHVIui/URgbTi", "email" : "rf@example.com", "name" : "RF Admin", "status" : "ACTIVE", "version" : NumberLong(0) }
{ "_id" : ObjectId("575fa8a2ba637304fffbad5f"), "_class" : "com.restfiddle.entity.User", "password" : "$2a$10$eyrBDJyNepEPsX3qTUveqeKNxYFq/nQq4sTixY/nRZhFynTW9izxm", "email" : "anuja@example.com", "name" : "Anuja Kumar", "status" : "ACTIVE", "version" : NumberLong(0) }

db.user.insert({'name':'Jason Chen','status':'ACTIVE'})

db.user.find().pretty();
{
"_id" : ObjectId("575fa8a2ba637304fffbad5e"),
"_class" : "com.restfiddle.entity.User",
"password" : "$2a$10$JzistJ7qIP80KMYwSqSu7uShUGn4bg/m.u0/51HcKHVIui/URgbTi",
"email" : "rf@example.com",
"name" : "RF Admin",
"status" : "ACTIVE",
"version" : NumberLong(0)
}
{
"_id" : ObjectId("575fa8a2ba637304fffbad5f"),
"_class" : "com.restfiddle.entity.User",
"password" : "$2a$10$eyrBDJyNepEPsX3qTUveqeKNxYFq/nQq4sTixY/nRZhFynTW9izxm",
"email" : "anuja@example.com",
"name" : "Anuja Kumar",
"status" : "ACTIVE",
"version" : NumberLong(0)
}
{
"_id" : ObjectId("58cfeededc2042106f53c868"),
"name" : "Jason Chen",
"status" : "ACTIVE"
}


我们可以看出,主键_id是每次插入的时候,自动生成的。那么,生成的算法是怎样的呢?

var id=new ObjectId();
id
ObjectId("58cfefcddc2042106f53c869")


参考:[MongoDB ObjectId详解及使用](http://www.jianshu.com/p/dd63b93a5955)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容