从 MongoDB Atlas 中读取数据 — 函数
在此页面上
本页上的示例演示了如何在Atlas Function中使用MongoDB Query API从Atlas 集群读取文档。
了解可用于查询数据的方法、可让您写入表达性匹配筛选器的操作符,以及将它们组合起来处理常见用例的一些模式。
数据模型
本页上的示例使用一个名为 store.items
的集合,它对在线商店中可购买的各种商品进行建模。每件商品具有 name
、库存 quantity
和客户 reviews
数组。
{ "title": "Item", "required": ["_id", "name", "quantity", "reviews"], "properties": { "_id": { "bsonType": "objectId" }, "name": { "bsonType": "string" }, "quantity": { "bsonType": "int" }, "reviews": { "bsonType": "array", "items": { "bsonType": "object", "required": ["username", "comment"], "properties": { "username": { "bsonType": "string" }, "comment": { "bsonType": "string" } } } } } }
片段设置
要在函数中使用代码片段,必须首先实例化MongoDB集合处理:
exports = function() { const mongodb = context.services.get("mongodb-atlas"); const itemsCollection = mongodb.db("store").collection("items"); const purchasesCollection = mongodb.db("store").collection("purchases"); // ... paste snippet here ... }
查询方法
查找单个文档findOne()
()
您可以使用 collection.findOne()
方法查找单个文档。
以下函数片段从 items
集合中查找一个 quantity
大于或等于 25
的文档:
const query = { "quantity": { "$gte": 25 } }; const projection = { "title": 1, "quantity": 1, } return itemsCollection.findOne(query, projection) .then(result => { if(result) { console.log(`Successfully found document: ${result}.`); } else { console.log("No document matches the provided query."); } return result; }) .catch(err => console.error(`Failed to find document: ${err}`));
查找一个或多个文档find()
()
您可以使用 collection.find()
方法查找多个文档。
以下函数片段查找 items
集合中至少有一条评论的所有文档,并返回按 name
排序的文档而省略 _id
字段:
const query = { "reviews.0": { "$exists": true } }; const projection = { "_id": 0 }; return itemsCollection.find(query, projection) .sort({ name: 1 }) .toArray() .then(items => { console.log(`Successfully found ${items.length} documents.`) items.forEach(console.log) return items }) .catch(err => console.error(`Failed to find documents: ${err}`))
对集合中的文档进行计数count()
()
您可以使用 collection.count()
方法对集合中的文档进行计数。您可以指定查询以控制要计数的文档。如果未指定查询,该方法将对集合中的所有文档进行计数。
以下函数片段计算 items
集合中至少有一条评论的文档数量:
return itemsCollection.count({ "reviews.0": { "$exists": true } }) .then(numDocs => console.log(`${numDocs} items have a review.`)) .catch(err => console.error("Failed to count documents: ", err))
查询模式
按文档 ID 查找
您可以查询一个集合以查找具有指定 ID 的文档。MongoDB 自动将每个文档的 ID 作为 ObjectId
值存储在文档的 _id
字段中。
{ "_id": <ObjectId> }
例子
以下查询匹配集合中 _id
值为 5ad84b81b8b998278f773c1b
的文档:
{ "_id": BSON.ObjectId("5ad84b81b8b998278f773c1b") }
按日期查找
您可以查询集合以查找字段具有特定日期值的文档,或查询某个日期范围内的文档。
{ "<Date Field Name>": <Date | Expression> }
例子
以下查询匹配集合中 createdAt
日期为 2019 年 1 月 23 日的文档:
{ "createdAt": new Date("2019-01-23T05:00:00.000Z") }
例子
以下查询匹配集合中 createdAt
日期为 2019 年的某个时间的文档:
{ "createdAt": { "$gte": new Date("2019-01-01T00:00:00.000Z"), "$lt": new Date("2020-01-01T00:00:00.000Z"), } }
匹配根级字段
您可以根据每个文档中根级字段的值查询集合。您可以指定 MongoDB 为每个文档计算的特定值或嵌套表达式。
有关更多信息,请参阅 MongoDB Server 手册中的查询文档教程。
{ "<Field Name>": <Value | Expression> }
例子
以下查询匹配 name
字段值为 Basketball
的文档:
{ "name": "Basketball" }
匹配多个字段
您可以在单个查询文档中指定多个查询条件。查询文档的每个根级字段都映射到集合中的一个字段。MongoDB 仅返回满足所有查询条件的文档。
有关更多信息,请参阅 MongoDB Server 手册中的对嵌入式/嵌套文档进行查询教程。
{ "<Field Name 1>": <Value | Expression>, "<Field Name 2>": <Value | Expression> }
例子
以下查询匹配 name
字段值为 Basketball
且 quantity
值大于零的文档:
{ "name": "Basketball", "quantity": { "$gt": 0 } }
匹配嵌入式文档字段
您可以根据嵌入式文档字段的值查询集合。要指定嵌入式文档字段,请使用多个嵌套查询表达式或标准文档点表示法。
有关更多信息,请参阅 MongoDB Server 手册中的对嵌入式/嵌套文档进行查询教程。
{ "<Field Name>": { "<Nested Field Name>": <Value | Expression> } }
{ "<Field Name>.<Nested Field Name>": <Value | Expression> }
例子
以下查询匹配 reviews
数组中的第一条评论由用户名为 JoeMango
的人员留下的文档:
{ "reviews.0.username": "JoeMango" }
匹配值数组
您可以根据数组字段中包含的所有元素查询集合。
如果您在一个数组字段中查询特定的值数组,MongoDB 将返回该数组字段与指定值数组完全匹配 的文档。如果您希望 MongoDB 返回该数组字段包含 指定值数组中的所有元素的文档,请使用 $all 操作符。
有关更多信息,请参阅 MongoDB Server 手册中的查询数组教程。
{ "<Array Field Name>": [<Value>, ...] }
例子
以下查询匹配特定的文档:reviews
数组恰好包含一个元素,并且该元素与指定文档匹配。
{ "reviews": [{ username: "JoeMango", comment: "This rocks!" }] }
例子
以下查询匹配reviews
大量包含一个或多个与所有指定文档匹配的元素的文档:
{ "reviews": { "$all": [{ username: "JoeMango", comment: "This rocks!" }] } }
匹配数组元素
您可以根据数组字段中一个或多个元素的值查询集合。
如果您使用具有多个条件的查询表达式查询一个数组字段,MongoDB 将返回数组元素的任意组合 满足该表达式的文档。如果您希望 MongoDB 返回单个 数组元素满足所有表达式条件的文档,请使用 $elemMatch 操作符。
有关更多信息,请参阅 MongoDB Server 手册中的查询数组教程。
{ "<Array Field Name>": <Value | Expression> }
例子
以下查询匹配特定的文档:reviews
数组中的元素任意组合 满足嵌入式表达式中的两个条件。指定的 username
和 comment
值不需要位于同一文档中:
{ "reviews": { "username": "JoeMango", "comment": "This is a great product!" } }
例子
以下查询匹配特定的文档:reviews
数组中的单个 元素满足嵌入式表达式中的两个条件。指定的 username
和 comment
必须位于同一文档中:
{ "reviews": { "$elemMatch": { "username": "JoeMango", "comment": "This is a great product!" } } }
查询运算符
Compare Values
您可以使用比较操作符将一个文档字段值与另一个值进行比较。
{ "<Field Name>": { "<Comparison Operator>": <Comparison Value> } }
可以使用以下比较操作符:
比较操作符 | 说明 |
---|---|
匹配字段的值等于指定值的文档。 | |
匹配字段的值不等于指定值的文档。 | |
匹配字段的值严格大于指定值的文档。 | |
匹配字段的值大于或等于指定值的文档。 | |
匹配字段的值严格小于指定值的文档。 | |
匹配字段值小于或等于指定值的文档。 | |
匹配字段的值包含在指定值数组中的文档。 | |
匹配指定值数组中未包含字段值的文档。 |
例子
以下查询匹配 quantity
大于零且小于或等于 10 的文档。
{ "quantity": { "$gt": 0, "$lte": 10 } }
计算逻辑表达式
您可以使用逻辑运算符计算单个字段的多个表达式。
{ "<Field Name>": { "<Logical Operator>": [<Expression>, ...] } }
可以使用以下逻辑运算符:
例子
以下查询匹配特定的文档:quantity
大于零,或者在 reviews
数组中具有不超过 5 个文档。
{ "$or": [ { "quantity": { "$gt": 0 } }, { "reviews": { "$size": { "$lte": 5 } } } ] }
计算正则表达式
您可以使用 $regex查询运算符返回具有与正则表达式 匹配的字段的文档。为避免与$regex
EJSON类型产生歧义,您必须使用 atlas- BSON对象。
{ "<Field Name>": { "$regex": BSON.BSONRegExp(<RegEx String>, <RegEx Options>) } }
例子
以下查询匹配 name
值包含子字符串 ball
(不区分大小写)的文档。
{ "name": { "$regex": BSON.BSONRegExp(".+ball", "i") } }