Docs 菜单
Docs 主页
/
MongoDB Atlas
/ / /

从 MongoDB Atlas 中读取数据 — 函数

在此页面上

  • 数据模型
  • 片段设置
  • 查询方法
  • 查找单个文档 (findOne())
  • 查找一个或多个文档 (find())
  • 对集合中的文档进行计数 (count())
  • 查询模式
  • 按文档 ID 查找
  • 按日期查找
  • 匹配根级字段
  • 匹配多个字段
  • 匹配嵌入式文档字段
  • 匹配值数组
  • 匹配数组元素
  • 查询运算符
  • Compare Values
  • 计算逻辑表达式
  • 计算正则表达式

本页上的示例演示了如何在Atlas Function中使用MongoDB Query API从Atlas 集群读取文档。

了解可用于查询数据的方法、可让您写入表达性匹配筛选器的操作符,以及将它们组合起来处理常见用例的一些模式

本页上的示例使用一个名为 store.items 的集合,它对在线商店中可购买的各种商品进行建模。每件商品具有 name、库存 quantity和客户 reviews 数组。

store.items 的 JSON 模式
{
"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 ...
}

您可以使用 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}`));

您可以使用 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}`))

您可以使用 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 的文档。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 字段值为 Basketballquantity 值大于零的文档:

{
"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 数组中的元素任意组合 满足嵌入式表达式中的两个条件。指定的 usernamecomment 值不需要位于同一文档中:

{
"reviews": {
"username": "JoeMango",
"comment": "This is a great product!"
}
}

例子

以下查询匹配特定的文档:reviews 数组中的单个 元素满足嵌入式表达式中的两个条件。指定的 usernamecomment 必须位于同一文档中:

{
"reviews": {
"$elemMatch": {
"username": "JoeMango",
"comment": "This is a great product!"
}
}
}

您可以使用比较操作符将一个文档字段值与另一个值进行比较。

{ "<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") }
}

后退

JavaScript 支持