Node.js 使用mongodb 增删改查

2018-01-23  本文已影响107人  日不落000

re.:
https://docs.mongodb.com/manual/reference/method/db.collection.insertOne/#db.collection.insertOne

/**
 * Created by nick on 2018/1/23.
 */
const dbName = 'test';
const url = 'mongodb://admin:admin123@172.16.34.14:27017/test'; //# 数据库为 test
var MongoClient = require('mongodb').MongoClient;
var assert = require('assert');
// Use connect method to connect to the server
MongoClient.connect(url, function (err, db) {
    if (err) {
        throw err;
    }
    console.log("Connected successfully to server");
    insertDocuments(db.db(dbName), function () {
        db.close();
    });
});

MongoClient.connect(url, function (err, db) {
    if (err) {
        throw err;
    }
    console.log("Connected successfully to server");
    findDocuments(db.db(dbName), function () {
        db.close();
    });
});

MongoClient.connect(url, function (err, db) {
    if (err) {
        throw err;
    }
    console.log("Connected successfully to server");
    updateDocument(db.db(dbName), function () {
        db.close();
    });
});

MongoClient.connect(url, function (err, db) {
    if (err) {
        throw err;
    }
    console.log("Connected successfully to server");
    removeDocument(db.db(dbName), function () {
        db.close();
    });
});

MongoClient.connect(url, function (err, db) {
    if (err) {
        throw err;
    }
    console.log("Connected successfully to server");
    indexCollection(db.db(dbName), function () {
        db.close();
    });
});

var insertDocuments = function (db, callback) {
    // Get the documents collection
    var collection = db.collection('documents');
    // Insert some documents
    collection.insertMany([
        { a : 1 }, { a : 2 }, { a : 3 }
    ], function (err, result) {
        assert.equal(err, null);
        assert.equal(3, result.result.n);
        assert.equal(3, result.ops.length);
        console.log("Inserted 3 documents into the collection");
        callback(result);
    });
}
var findDocuments = function (db, callback) {
    // Get the documents collection
    var collection = db.collection('documents');
    // Find some documents
    collection.find({}).toArray(function (err, docs) {
        assert.equal(err, null);
        console.log("Found the following records");
        console.log(docs)
        callback(docs);
    });
}

var findDocuments = function (db, callback) {
    // Get the documents collection
    var collection = db.collection('documents');
    // Find some documents
    collection.find({ 'a' : 3 }).toArray(function (err, docs) {
        assert.equal(err, null);
        console.log("Found the following records");
        console.log(docs);
        callback(docs);
    });
}

var updateDocument = function (db, callback) {
    // Get the documents collection
    var collection = db.collection('documents');
    // Update document where a is 2, set b equal to 1
    collection.updateOne({ a : 2 }
        , { $set : { b : 1 } }, function (err, result) {
            assert.equal(err, null);
            assert.equal(1, result.result.n);
            console.log("Updated the document with the field a equal to 2");
            callback(result);
        });
}

var removeDocument = function (db, callback) {
    // Get the documents collection
    var collection = db.collection('documents');
    // Delete document where a is 3
    collection.deleteOne({ a : 3 }, function (err, result) {
        assert.equal(err, null);
        assert.equal(1, result.result.n);
        console.log("Removed the document with the field a equal to 3");
        callback(result);
    });
}

var indexCollection = function (db, callback) {
    db.collection('documents').createIndex(
        { "a" : 1 },
        null,
        function (err, results) {
            console.log(results);
            callback();
        }
    );
};

  





basic use:

var cursor = db.collection('inventory').find({ 
  status: "A", 
  qty: { $lt: 30 }
});
<=>
SELECT * FROM inventory WHERE status = "A" AND qty < 30


---
var cursor = db.collection('inventory').find({ 
  $or: [ {status: "A" }, { qty: { $lt: 30 } } ]
});
<=>
SELECT * FROM inventory WHERE status = "A" OR qty < 30


---
var cursor = db.collection('inventory').find({ 
  status: "A",
  $or: [ { qty: { $lt: 30 } }, { item: { $regex: "^p" } } ]
});
<=>
SELECT * FROM inventory WHERE status = "A" AND ( qty < 30 OR item LIKE "p%")


---
var cursor = db.collection('inventory').find({ 
  size: { w: 21, h: 14, uom: "cm" }
});
var cursor = db.collection('inventory').find({ 
  "size.uom": "in"
});
var cursor = db.collection('inventory').find({ 
  "size.h": { $lt: 15 }, 
  "size.uom": "in", 
  status: "D"
});


---
Query an Array
https://docs.mongodb.com/manual/tutorial/query-arrays/

- Match an Array
The following example queries for all documents where the field tags value is an array 
with exactly two elements, "red" and "blank", in the specified order:
//TODO tags数组是[ "red", "blank" ]的精确查找(值和顺序是一致的)
var cursor = db.collection('inventory').find({ 
  tags: [ "red", "blank" ]
});

If, instead, you wish to find an array that contains both the elements `"red"` and 
`"blank"`, without regard to order or other elements in the array, use the [`$all`]
(https://docs.mongodb.com/manual/reference/operator/query/all/#op._S_all "$all") operator:
//TODO tags数组内包含“red”和“blank”,不管顺序和其他元素
var cursor = db.collection('inventory').find({ 
  tags: { $all: [ "red", "blank" ]}
});


- Query an Array for an Element
The following example queries for all documents where tags is an array that contains the 
string "red" as one of its elements:
//TODO tags数组中包含元素“red”
var cursor = db.collection('inventory').find({ 
  tags: "red"
});

For example, the following operation queries for all documents where the array dim_cm 
contains at least one element whose value is greater than 25.
//TODO dim_cm数组中至少有一个元素大于25
var cursor = db.collection('inventory').find({ 
  dim_cm: { $gt: 25 }
});


- Specify Multiple Conditions for Array Elements
The following example queries for documents where the dim_cm array contains elements 
that in some combination satisfy the query conditions; e.g., one element can satisfy the 
greater than 15 condition and another element can satisfy the less than 20 condition, or a
 single element can satisfy both:
//TODO dim_cm数组中有的元素大于15,有的元素小于20,或者有的元素大于15小于20
var cursor = db.collection('inventory').find({ 
  dim_cm: { $gt: 15, $lt: 20 }
});

Query for an Array Element that Meets Multiple Criteria
查询符合多个标准的数组元素
The following example queries for documents where the `dim_cm` array contains at least 
one element that is both greater than 
([`$gt`](https://docs.mongodb.com/manual/reference/operator/query/gt/#op._S_gt "$gt"))
 `22` and less than
 ([`$lt`](https://docs.mongodb.com/manual/reference/operator/query/lt/#op._S_lt "$lt")) `30`:
//TODO dim_cm数组中有的元素既大于22又小于30
var cursor = db.collection('inventory').find({ 
  dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } }
});


- Query for an Element by the Array Index Position
The following example queries for all documents where the second element in the array 
dim_cm is greater than 25:
//TODO dim_cm数组中第二个元素大于25
var cursor = db.collection('inventory').find({ 
  "dim_cm.1": { $gt: 25 }
});


- Query an Array by Array Length
For example, the following selects documents where the array tags has 3 elements.
var cursor = db.collection('inventory').find({ 
  tags: { $size: 3 }
});


- Query an Array of Embedded Documents

[{ item: "journal",
    instock: [
      { warehouse: "A", qty: 5 },
      { warehouse: "C", qty: 15 }]},]

- Query for a Document Nested in an Array
The following example selects all documents where an element in the instock array 
matches the specified document:

var cursor = db.collection('inventory').find({ 
  instock: { warehouse: "A", qty: 5 }
});

//TODO 元素的顺序很重要
the following query does not match any documents in the inventory collection:
//TODO 以下找不到任何数据
var cursor = db.collection('inventory').find({ 
  instock: { qty: 5, warehouse: "A" }
});


- Specify a Query Condition on a Field Embedded in an Array of Documents
The following example selects all documents where the instock array has at least one 
embedded document that contains the field qty whose value is less than or equal to 20:
//TODO instock数组中,任意元素的qty字段的值小于等于20
var cursor = db.collection('inventory').find({ 
  "instock.qty": { $lte: 20 }
});


- Use the Array Index to Query for a Field in the Embedded Document
The following example selects all documents where the instock array has as its first 
element a document that contains the field qty whose value is less than or equal to 20:
//TODO instock数组中,第一个元素的qty字段小于等于20
var cursor = db.collection('inventory').find({ 
  "instock.0.qty": { $lte: 20 }
});


- Specify Multiple Conditions for Array of Documents

- A Single Nested Document Meets Multiple Query Conditions on Nested Fields
The following example queries for documents where the instock array has at least one 
embedded document that contains both the field qty equal to 5 and the field warehouse 
equal to A:
/*
TODO instock数组中,至少有一个元素满足qty字段的值为5,warehouse字段的值为“A”,
和字段的顺序无关
*/
var cursor = db.collection('inventory').find({ 
  instock: { $elemMatch: { qty: 5, warehouse: "A" } }
});

The following example queries for documents where the instock array has at least one 
embedded document that contains the field qty that is greater than 10 and less than or 
equal to 20:
//TODO instock数组中,至少有一个元素的qty字段的值大于10且小于等于20
var cursor = db.collection('inventory').find({ 
  instock: { $elemMatch: { qty: { $gt: 10, $lte: 20 } } }
});


- Combination of Elements Satisfies the Criteria
元素组合满足标准
For example, the following query matches documents where any document nested in the 
instock array has the qty field greater than 10 and any document (but not necessarily the 
same embedded document) in the array has the qty field less than or equal to 20:
//TODO instock数组中,有的元素的qty字段的值大于10,有的元素的qty字段的值小于等于20
var cursor = db.collection('inventory').find({ 
  "instock.qty": { $gt: 10, $lte: 20 }
});

The following example queries for documents where the instock array has at least one 
embedded document that contains the field qty equal to 5 and at least one embedded 
document (but not necessarily the same embedded document) that contains the field 
warehouse equal to A:
//TODO instock数组中,有的元素的qty字段的值为5,有的元素的warehouse字段的值为“A"
var cursor = db.collection('inventory').find({ 
  "instock.qty": 5, "instock.warehouse": "A"
});


---
- Project Fields to Return from Query
[
{ item: "journal",
    status: "A",
    size: { h: 14, w: 21, uom: "cm" },
    instock: [ { warehouse: "A", qty: 5 } ]},
]


- Return All Fields in Matching Documents
var cursor = db.collection('inventory').find({ 
  status: "A"
});
<=>
SELECT * from inventory WHERE status = "A"


---
- Return the Specified Fields and the _id Field Only
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1 });
<=>
SELECT _id, item, status from inventory WHERE status = "A"


- Suppress _id Field
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, _id: 0 });
<=>
SELECT item, status from inventory WHERE status = "A"


---
- Return All But the Excluded Fields
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ status: 0, instock: 0 });


---
- Return Specific Fields in Embedded Documents
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "size.uom": 1 });


---
- Suppress Specific Fields in Embedded Documents
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ "size.uom": 0 });


---
- Projection on Embedded Documents in an Array
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "instock.qty": 1 });


---
- Project Specific Array Elements in the Returned Array
The following example uses the [`$slice`](https://docs.mongodb.com/manual/reference
/operator/projection/slice/#proj._S_slice "$slice") projection operator to return the last 
element in the `instock` array:
//TODO inventory集合中,status值为”A“,返回值包含字段item,status,instock,其中instock数组中只返回最后一项元素($slice:-2 最后两项元素,$slice:2 前两项元素)。
var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "instock": { $slice: -1 } });


db.students.find( { grades: { $elemMatch: {
                                            mean: { $gt: 70 },
                                            grade: { $gt:90 }
                                          } } },
                  { "grades.$": 1 } )


 In the following query, the projection { "grades.$": 1 } returns only the first element with the mean greater than 70 for the grades field:
db.students.find(
   { "grades.mean": { $gt: 70 } },
   { "grades.$": 1 }
)

{ "_id" : 7, "grades" : [  {  "grade" : 80,  "mean" : 75,  "std" : 8 } ] }
{ "_id" : 8, "grades" : [  {  "grade" : 92,  "mean" : 88,  "std" : 8 } ] }


---
- Update Documents in a Collection
[
{ item: "canvas",
    qty: 100,
    size: {h: 28, w: 35.5, uom: "cm"},
    status: "A"},
]

uses the [`$currentDate`](https://docs.mongodb.com/manual/reference/operator/update
/currentDate/#up._S_currentDate "$currentDate") operator to update the value of the 
`lastModified` field to the current date. If `lastModified` field does not exist, 
[`$currentDate`](https://docs.mongodb.com/manual/reference/operator/update
/currentDate/#up._S_currentDate "$currentDate") will create the field. See 
[`$currentDate`](https://docs.mongodb.com/manual/reference/operator/update
/currentDate/#up._S_currentDate "$currentDate") for details.


- Update a Single Document

db.collection('inventory').updateOne(
  { item: "paper" },
  { $set: { "size.uom": "cm", status: "P" },
    $currentDate: { lastModified: true } })
.then(function(result) {
  // process result
})            


- Update Multiple Documents

db.collection('inventory').updateMany(
  { qty: { $lt: 50 } },
  { $set: { "size.uom": "in", status: "P" },
    $currentDate: { lastModified: true } })
.then(function(result) {
  // process result
})            


---
- Replace a Document
The following example replaces the first document from the inventory collection where item: "paper":
//TODO 替换
db.collection('inventory').replaceOne(
  { item: "paper" },
  { item: "paper", 
    instock: [
      { warehouse: "A", qty: 60 },
      { warehouse: "B", qty: 40 }
    ]})
.then(function(result) {
  // process result
})





Although you can express this query using the [`$or`](https://docs.mongodb.com
/manual/reference/operator/query/or/#op._S_or "$or") operator, choose the [`$in`]
(https://docs.mongodb.com/manual/reference/operator/query/in/#op._S_in "$in") 
operator rather than the [`$or`](https://docs.mongodb.com/manual/reference/operator
/query/or/#op._S_or "$or") operator when performing equality checks on the same field.


---







Additional Methods for Inserts

The following methods can also add new documents to a collection:



https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/#examples

https://docs.mongodb.com/manual/reference/operator/query/expr/#op._S_expr


上一篇下一篇

猜你喜欢

热点阅读