本文基于 MongoDB
的 Node.JS
驱动实现 MongoDB
基本的增删改查操作。驱动官方文档见: mongodb.github.io/node-mongod…
。
MongoDB
中 Collection
类的 insertOne
和 insertMany
方法用来插入文档。
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URl const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function() { try { await client.connect(); console.log('connected correctly to server'); const db = client.db(dbName); // Insert a single document let r = await db.collection('inserts').insertOne({a: 1}); assert.equal(1, r.insertedCount); // Insert multiple documents r = await db.collection('inserts').insertMany([{a: 2}, {a: 3}]); assert.equal(2, r.insertedCount); // Close connection client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
第一个 insert
语句向 inserts
集合中插入单个文档,注意在 MongoDB
中无需显示的创建集合 inserts
, MongoDB
服务会在首次插入文档时自动创建该集合。 insertOne
和 insertMany
方法接收第二个参数 options
,可以配置 写关注
、 函数序列化
等参数,具体参数列表见: mongodb.github.io/node-mongod…
。
例如下面这段代码会将传入的函数序列化并写入到副本集 replica set
:
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function() { try { await client.connect(); console.log('connected correctly to server'); const db = client.db(dbName); // Insert a single document const r = await db.collection('inserts').insertOne({ a: 1, b: function () {return 'hello';} }, { w: 'majority', wtimeout: 10000, serializeFunctions: true, forceServerObjectId: true }); assert.equal(1, r.insertedCount); client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
Collection
类的 updateOne
和 updateMany
方法用于实现更新操作。
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function () { try { await client.connect(); console.log("Connected correctly to server"); const db = client.db(dbName); // Get the updates collection const col = db.collection('updates'); // Insert some documents let r = await col.insertMany([{a: 1}, {a: 2}, {a: 2}]); assert.equal(3, r.insertedCount); // Update a single document r = await col.updateOne({a: 1}, {$set: {b: 1}}); assert.equal(1, r.matchedCount); assert.equal(1, r.modifiedCount); // Update multiple documents r = await col.updateMany({a: 2}, {$set: {b: 2}}); assert.equal(2, r.matchedCount); assert.equal(2, r.modifiedCount); // Upsert a single document r = await col.updateOne({a: 3}, {$set: {b: 3}}); assert.equal(0, r.matchedCount); assert.equal(1, r.upsertedCount); // Close connection client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
updateOne
和 updateMany
方法接收第三个参数 options
,可以用来配置 写关注
、 更新并插入
等参数,具体参数列表见: mongodb.github.io/node-mongod…
。
Collection
类的 deleteOne
和 deleteMany
方法可以用来删除文档。
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function () { try { await client.connect(); console.log("Connected correctly to server"); const db = client.db(dbName); // Get the collection to remove const col = db.collection('removes'); // Insert some documents let r = await col.insertMany([{a: 1}, {a: 2}, {a: 2}]); assert.equal(3, r.insertedCount); // Remove a single document r = await col.deleteOne({a: 1}); assert.equal(1, r.deletedCount); // Remove multiple documents r = await col.deleteMany({a: 2}); assert.equal(2, r.deletedCount); // Close connection client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
deleteOne
和 deleteMany
方法可以接收第二个参数 options
,用来配置 写关注
等参数,具体参数列表见: mongodb.github.io/node-mongod…
。
查询 MongoDB
的主要方法是 find
方法。 find
方法返回一个用来操作数据的 游标
。下面的代码限制查询个数为2条文档,并使用 toArray
方法导出文档。
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function () { try { await client.connect(); console.log("Connected correctly to server"); const db = client.db(dbName); // Get the collection const col = db.collection('find'); // Insert some documents const r = await col.insertMany([{a: 1}, {a: 1}, {a: 1}]); assert.equal(3, r.insertedCount); // Get first two documents that match the query const docs = await col.find({a: 1}).limit(2).toArray(); assert.equal(2, docs.length); // Close connection client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
方法 find
返回的 游标
支持各种链式调用,具体支持的方法见: mongodb.github.io/node-mongod…
。
例如下面的代码使用 游标
的 next
方法进行迭代:
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database name const dbName = 'myproject'; const client = new MongoClient(url); (async function () { try { await client.connect(); console.log("Connected correctly to server"); const db = client.db(dbName); // Get the collection const col = db.collection('find'); // Insert some documents const r = col.insertMany([{a: 1}, {a: 1}, {a: 1}]); assert.equal(3, r.insertedCount); // Get the cursor const cursor = col.find({a: 1}).limit(2); // Iterate over the cursor while(await cursor.hasNext()) { const doc = cursor.next(); console.dir(doc); } // Close connection client.close(); } catch(err) { console.log(err.stack); } })(); 复制代码
下面的代码使用 游标
的 each
方法进行迭代:
const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'myproject'; const client = new MongoClient(url); (async function () { try { await client.connect(); console.log("Connected correctly to server"); const db = client.db(dbName); const col = db.collection('find'); const r = await col.insertMany([{a:1}, {a:1}, {a:1}]); assert.equal(3, r.insertedCount); col.find({a: 1}).limit(2).each((err, doc) => { if (doc) { console.dir(doc); } else { client.close(); return false; } }); } catch(err) { console.log(err.stack); } })(); 复制代码
我来评几句
登录后评论已发表评论数()