介绍
MongoDB是一个流行的NoSQL数据库,支持存储复杂数据类型,其中包括数组。当使用MongoDB查询文档内的数组时,可能需要对数组进行过滤,以返回特定条件的文档元素。本文将介绍如何使用MongoDB对文档内的数组进行过滤。
前提条件
在本文中,我们将使用MongoDB 4.4和Python 3.x。您需要完成以下步骤来设置您的开发环境:
安装MongoDB
安装pymongo Python库
安装Jupyter Notebook
过滤数组
在MongoDB中,可以使用$elemMatch操作符过滤嵌套在文档内的数组。这个操作符接受一个条件作为参数,它将执行查询,只返回符合条件的数组元素。
1. 创建一个包含数组的文档
我们将首先创建一个包含数组的文档。请使用以下命令在MongoDB中创建一个名为"inventory"的新集合:
db.createCollection("inventory")
现在我们将使用以下代码将上面创建的文档插入到该集合中:
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A", tags: [ "blank", "red" ] },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A", tags: [ "red", "blank" ] },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D", tags: [ "red", "blank", "plain" ] },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D", tags: [ "blank", "red" ] },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A", tags: [ "blue" ] }
]);
这将创建一个包含多个文档和数组的集合。
2. 过滤标记数组
现在我们将使用$elemMatch操作符过滤标记数组中的元素。以下代码过滤了标记数组中包含"red"元素的文档:
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017/")
mydb = myclient["mydatabase"]
mycol = mydb["inventory"]
myquery = { "tags": { "$elemMatch": { "$eq": "red" } } }
mydocs = mycol.find(myquery)
for x in mydocs:
print(x)
这将输出以下文档:
{ "_id" : ObjectId("601c5d1b356fd6a9c7a37d63"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A", "tags" : [ "blank", "red" ] }
{ "_id" : ObjectId("601c5d1b356fd6a9c7a37d64"), "item" : "notebook", "qty" : 50, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "A", "tags" : [ "red", "blank" ] }
{ "_id" : ObjectId("601c5d1b356fd6a9c7a37d66"), "item" : "paper", "qty" : 100, "size" : { "h" : 8.5, "w" : 11, "uom" : "in" }, "status" : "D", "tags" : [ "red", "blank", "plain" ] }
{ "_id" : ObjectId("601c5d1b356fd6a9c7a37d68"), "item" : "planner", "qty" : 75, "size" : { "h" : 22.85, "w" : 30, "uom" : "cm" }, "status" : "D", "tags" : [ "blank", "red" ] }
在这个例子中,$elemMatch操作符用于匹配包含"red"元素的tags数组元素。
3. 过滤嵌套数组
有时候,您可能需要过滤嵌套在一个嵌入式文档内的数组。以下代码过滤嵌套在size文档内的数组元素:
myquery = { "size.uom": "in", "size.h": { "$lt": 10 }, "size.w": { "$lt": 8 } }
mydocs = mycol.find(myquery)
for x in mydocs:
print(x)
这将输出以下文档:
{ "_id" : ObjectId("601c5d1b356fd6a9c7a37d63"), "item" : "journal", "qty" : 25, "size" : { "h" : 14, "w" : 21, "uom" : "cm" }, "status" : "A", "tags" : [ "blank", "red" ] }
在这个例子中,使用了$lt操作符对高度和宽度进行过滤,以及使用了$elemMatch操作符来匹配uom键包含"in"的元素。
总结
在本文中,我们介绍了如何使用MongoDB查询文档内的数组,并演示了如何使用$elemMatch操作符过滤标记和嵌套数组。通过这些技术,您可以轻松过滤文档内的数组,以找到您需要的特定元素。