1. 程式人生 > >mongoDB node驅動的增刪改查方法

mongoDB node驅動的增刪改查方法

插入文件

插入單個文件

以下程式碼將新文件插入到 inventory集合中(如果此集合不存在,則插入操作將建立集合。)

db.collection('inventory').insertOne({
  item: "canvas",
  qty: 100,
  tags: ["cotton"],
  size: { h: 28, w: 35.5, uom: "cm" }
})
.then(function(result) {
  // process result
})

insertOne() 返回一個promise 物件。

插入多條文件

Collection.insertMany()可以通過一個數組將多個文件 插入到一個集合中。

db.collection('inventory').insertMany([
  { item: "journal",
    qty: 25,
    tags: ["blank", "red"],
    size: { h: 14, w: 21, uom: "cm" }},
  { item: "mat",
    qty: 85,
    tags: ["gray"],
    size: { h: 27.9, w: 35.5, uom: "cm" }},
  { item: "mousepad",
    qty: 25,
    tags: ["gel", "blue"],
    size: { h: 19
, w: 22.85, uom: "cm" }} ]) .then(function(result) { // process result })

insert()方法可以插入一條或多條文件

查詢文件

我們使用MongoDB Node.js驅動程式中的Collection.find()方法進行查詢操作。示例使用inventory集合。請先執行以下命令插入一些資料以供查詢:

db.collection('inventory').insertMany([
  { item: "journal",
    qty: 25,
    size: { h: 14, w: 21, uom: "cm"
}, status: "A"}, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A"}, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D"}, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D"}, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A"} ]) .then(function(result) { // process result })

查詢集合中所有文件

要返回集合中的所有文件,將一個空物件作為查詢條件傳遞給find方法即可。

var cursor = db.collection('inventory').find({});

指定查詢條件

以下程式碼從inventory集合查詢到所有status 為D的文件:

var cursor = db.collection('inventory').find({ status: "D" });

使用查詢運算子

使用查詢運算子可以進行一些高階的查詢

比如我們想從inventory 集合中檢索出所有status等於”A”或”D”的文件:

var cursor = db.collection('inventory').find({ 
  status: { $in: ["A", "D"] }
});

要檢索出inventory 集合中status等於 “A” 且 qty小於30的所有文件:

var cursor = db.collection('inventory').find({ 
  status: "A", 
  qty: { $lt: 30 }
});

一些條件操作符

名稱 描述
$eq 等於
$gt 大於
$gte 大於等於
$in 陣列中指定的所有。
$lt 小於
$lte 小於等於
$ne 不等於
$nin 不匹配陣列中指定的值

檢索出inventory 集合中所有status等於”A” 或 qty小於30的文件:

var cursor = db.collection('inventory').find({ 
  $or: [ {status: "A" }, { qty: { $lt: 30 } } ]
});

檢索出inventory 集合中status等於”A” 且 qty小於30或item以p開頭的文件:

var cursor = db.collection('inventory').find({ 
  status: "A",
  $or: [ { qty: { $lt: 30 } }, { item: { $regex: "^p" } } ]
});

嵌入/巢狀文件的查詢

操作示例前需先插入一些巢狀文件,本示例採用以下文件:

db.collection('inventory').insertMany([
  { item: "journal",
    qty: 25,
    size: { h: 14, w: 21, uom: "cm" },
    status: "A"},
  { item: "notebook",
    qty: 50,
    size: { h: 8.5, w: 11, uom: "in" },
    status: "A"},
  { item: "paper",
    qty: 100,
    size: { h: 8.5, w: 11, uom: "in" },
    status: "D"},
  { item: "planner",
    qty: 75, size: { h: 22.85, w: 30, uom: "cm" },
    status: "D"},
  { item: "postcard",
    qty: 45,
    size: { h: 10, w: 15.25, uom: "cm" },
    status: "A"}
])
.then(function(result) {
  // process result
})

如果某個欄位的值是一個文件(可以理解成js的物件)使用該欄位進行查詢時 {<field>: <value>} :

例如,以下程式碼查詢欄位size等於{ h: 14, w: 21, uom: “cm” }的所有 文件:

var cursor = db.collection('inventory').find({ 
  size: { h: 14, w: 21, uom: "cm" }
});

這種方式需要精確匹配包括欄位順序。例如,以下查詢與inventory集合中的任何文件都不匹配 :

var cursor = db.collection('inventory').find({ 
  size: { w: 21, h: 14, uom: "cm" }
});

要使用嵌入/巢狀文件中的欄位作為條件,請使用點符號(”field.nestedField”)。

以下示例查詢欄位 size中uom欄位等於”in”的所有文件:

var cursor = db.collection('inventory').find({ 
  "size.uom": "in"
});

使用查詢運算子指定匹配

以下程式碼查詢size欄位中h欄位小於15的所有文件

var cursor = db.collection('inventory').find({ 
  "size.h": { $lt: 15 }
});

指定AND條件

以下程式碼查詢size欄位中h欄位小於15,size欄位中uom欄位為“in”且status欄位為“D”的所有文件

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

查詢陣列

操作示例前需先插入一些欄位為陣列的文件,本示例採用以下文件:

db.collection('inventory').insertMany([
  { item: "journal",
    qty: 25,
    tags: ["blank", "red"],
    dim_cm: [14, 21]},
  { item: "notebook",
    qty: 50,
    tags: ["red", "blank"],
    dim_cm: [14, 21]},
  { item: "paper",
    qty: 100,
    tags: ["red", "blank", "plain"],
    dim_cm: [14, 21]},
  { item: "planner",
    qty: 75,
    tags: ["blank", "red"],
    dim_cm: [22.85, 30]},
  { item: "postcard",
    qty: 45,
    tags: ["blue"],
    dim_cm: [10, 15.25]}
])
.then(function(result) {
  // process result
})

直接以值為陣列的欄位作為查詢條件,需要精確匹配包括陣列順序:

以下示例查詢欄位tags 值為具有兩個元素的陣列,並且按照”red”,”blank”的順序:

var cursor = db.collection('inventory').find({ 
  tags: [ "red", "blank" ]
});

如果要查詢陣列中含有“red”和“blank”兩個元素且不考慮順序和是否含有其他元素,請使用$all運算子:

var cursor = db.collection('inventory').find({ 
  tags: { $all: [ "red", "blank" ]}
});

要查詢陣列中至少包含一個指定元素,請使用過濾器 { <field>: <value> }

以下示例查詢欄位tags中包含字串”red”作為其陣列的元素之一:

var cursor = db.collection('inventory').find({ 
  tags: "red"
});

如要在陣列欄位中指定元素的條件,請在 查詢過濾器文件({ <array field>: { <operator1>: <value1>, ... } })中使用查詢運算子。

以下操作將查詢陣列dim_cm中至少包含一個值大於25的元素的所有文件 。

var cursor = db.collection('inventory').find({ 
  dim_cm: { $gt: 25 }
});

為陣列元素指定多個條件

在陣列元素上指定多個條件時,需要單個數組元素滿足所有條件,或者陣列元素的任意組合滿足條件。

以下示例查詢dim_cm陣列包含某些組合可以滿足查詢條件的元素; 例如,一個元素大於15條件,另一個元素小於20條件,或者單個元素可以滿足兩者:

var cursor = db.collection('inventory').find({ 
  dim_cm: { $gt: 15, $lt: 20 }
});

使用$elemMatch運算子在陣列的元素上指定多個條件,使其至少有一個數組元素滿足所有指定的條件。

以下示例查詢dim_cm陣列至少包含一個大於($gt) 22且小($lt)30的元素的所有文件:

var cursor = db.collection('inventory').find({ 
  dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } }
});

通過陣列索引位置查詢

為陣列指定索引或位置作為查詢條件請使用點(.)符號,索引從零開始。

以下示例查詢陣列dim_cm中第二個元素大於25的所有文件:

var cursor = db.collection('inventory').find({ 
  "dim_cm.1": { $gt: 25 }
});

通過陣列的長度查詢

使用$size運算子通過陣列長度來查詢。例如,以下程式碼檢索陣列tags具有3個元素的所有文件 。

var cursor = db.collection('inventory').find({ 
  tags: { $size: 3 }
});

查詢嵌入文件的陣列

操作示例前需先插入一些欄位為陣列且陣列元素為文件的文件,本示例採用以下文件:

db.collection('inventory').insertMany([
  { item: "journal",
    instock: [
      { warehouse: "A", qty: 5 },
      { warehouse: "C", qty: 15 }]},
  { item: "notebook",
    instock: [
      { warehouse: "C", qty: 5 }]},
  { item: "paper",
    instock: [
      { warehouse: "A", qty: 60 },
      { warehouse: "B", qty: 15 }]},
  { item: "planner",
    instock: [
      { warehouse: "A", qty: 40 },
      { warehouse: "B", qty: 5 }]},
  { item: "postcard",
    instock: [
      { warehouse: "B", qty: 15 },
      { warehouse: "C", qty: 35 }]}
])
.then(function(result) {
  // process result
})

查詢巢狀在陣列中的文件

以下示例檢索instock陣列中的元素與指定文件匹配的所有文件:

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

此匹配需要精確匹配,包括欄位順序。例如,以下查詢與inventory集合中的任何文件不匹配 :

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

使用陣列索引對應的文件的欄位查詢:

你可以使用點符號在文件中的陣列的特定索引或位置處指定嵌入文件的欄位作為查詢條件。

以下示例檢索instock陣列的第一個元素的qty欄位的值小於或等於20的所有文件:

var cursor = db.collection('inventory').find({ 
  "instock.0.qty": { $lte: 20 }
});

如果不知道巢狀在陣列中的文件的索引位置,則將陣列欄位的名稱與點(.)和巢狀文件中的欄位的名稱相連線。

以下示例檢索instock陣列中至少包含一個物件其qty欄位的值小於或等於20的所有文件:

var cursor = db.collection('inventory').find({ 
  "instock.qty": { $lte: 20 }
});

為陣列指定多個條件

單個巢狀文件滿足多個查詢條件
使用$elemMatch運算子在嵌入式文件陣列上指定多個條件是,需至少一個嵌入文件滿足所有指定的條件

以下示例查詢到的文件,其中instock陣列至少包含一個物件其qty欄位等於5且warehouse欄位等於A:

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

以下示例查詢instock陣列至少包含一個物件其qty欄位大於10且小於或等於20:

var cursor = db.collection('inventory').find({ 
  instock: { $elemMatch: { qty: { $gt: 10, $lte: 20 } } }
});

如果陣列欄位上的複合查詢條件不使用 $elemMatch運算子,則將查詢到其陣列包含滿足條件的任意元素組合的所有文件。。

例如,以下查詢匹配到的文件,其中巢狀在instock陣列中的任何文件的qty欄位大於10且任何文件(但不一定相同的嵌入文件)的qty欄位小於或等於20:

var cursor = db.collection('inventory').find({ 
  "instock.qty": { $gt: 10, $lte: 20 }
});

以下示例查詢到的文件,其中instock陣列至少包含一個qty欄位等於5和一個warehouse欄位等於A的物件:

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

選擇返回哪些欄位

預設情況下,MongoDB中的查詢返回匹配文件中的所有欄位。為了限制MongoDB傳送給應用程式的資料量,您可以包括一個對映文件來指定或限制要返回的欄位。

操作示例前需先插入一些文件,本示例採用以下文件:

db.collection('inventory').insertMany([
  { item: "journal",
    status: "A",
    size: { h: 14, w: 21, uom: "cm" },
    instock: [ { warehouse: "A", qty: 5 } ]},
  { item: "notebook",
    status: "A",
    size: { h: 8.5, w: 11, uom: "in" },
    instock: [ { warehouse: "C", qty: 5 } ]},
  { item: "paper",
    status: "D",
    size: { h: 8.5, w: 11, uom: "in" },
    instock: [ { warehouse: "A", qty: 60 } ]},
  { item: "planner",
    status: "D",
    size: { h: 22.85, w: 30, uom: "cm"},
    instock: [ { warehouse: "A", qty: 40 } ]},
  { item: "postcard",
    status: "A",
    size: { h: 10, w: 15.25, uom: "cm" },
    instock: [
        { warehouse: "B", qty: 15 },
        { warehouse: "C", qty: 35 }]}
])
.then(function(result) {
  // process result
})

返回匹配文件中的所有欄位

如果不指定對映文件,則 find()方法將返回匹配文件中的所有欄位。

以下示例返回inventory集合中所有status等於”A”的所有文件的所有欄位

var cursor = db.collection('inventory').find({ 
  status: "A"
});

只返回指定欄位和_id欄位

可以通過在對映文件中設定要顯示的欄位為1來宣告要返回的欄位。以下操作返回與查詢匹配的所有文件只包含item和status欄位。對於該_id欄位,您不必明確指定返回該欄位。除非指定要禁止該欄位,否則該方法始終返回_id欄位

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1 });

禁止_id欄位

可以在對映文件中設定_id欄位等於零來禁止其返回,如下面的例子:

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, _id: 0 });

設定排除的欄位

您可以使用對映來排除特定欄位,而不是列出要在匹配文件中返回的欄位。以下示例返回匹配文件中除了status和instock欄位之外的所有欄位:

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ status: 0, instock: 0 });

除了_id欄位外,不能在投影文件中組合包含和排除語句。

返回特定欄位內嵌檔案

可以在嵌入式文件中返回特定欄位。使用點表示法來引用嵌入欄位,並將其在對映檔案中設定為1。

以下示例返回: 文件中的_id欄位(預設返回), item欄位,status欄位和size中的uom欄位; uom欄位仍然嵌入在size文件中。

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "size.uom": 1 });

排除內嵌檔案中具體欄位

可以禁止嵌入文件中的特定欄位。使用 點符號來引用對映文件中的嵌入欄位並設定為0。

以下示例指定要排除文件中size欄位的uom 欄位。所有其他欄位在匹配的文件中返回:

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ "size.uom": 0 });

嵌入式文件在陣列中的對映

使用點表示法來嵌入陣列中的文件內的特定欄位。

以下示例指定一個對映來返回文件中的item欄位,status欄位和嵌入到instock陣列中文件的qty欄位。_id預設返回。

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "instock.qty": 1 });

返回陣列中的特定元素

對於包含陣列的欄位,MongoDB的提供瞭如下的投對映運算子:$elemMatch$slice,和$

以下示例使用$slice 對映運算子只返回instock陣列中的最後一個元素。

var cursor = db.collection('inventory').find({ 
  status: "A"
}).project({ item: 1, status: 1, "instock": { $slice: -1 } });

$elemMatch$slice$是將特定元素對映到包含在返回的陣列中的唯一方法。例如,您不能 使用陣列索引來對映特定的陣列元素; 例如此對映不會使用第一個元素對映陣列。{ “instock.0”: 1 }