mongodb如何对文档内数组进行过滤的方法步骤

介绍

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操作符过滤标记和嵌套数组。通过这些技术,您可以轻松过滤文档内的数组,以找到您需要的特定元素。

数据库标签