$filter - Amazon DocumentDB

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

$filter

Amazon DocumentDB 中的$filter運算子用於將篩選條件表達式套用至陣列的每個元素,並傳回僅包含符合指定條件之元素的陣列。當您需要對文件中的陣列欄位執行複雜的篩選操作時,此運算子非常有用。

參數

  • input:要篩選的陣列欄位。

  • as:用於cond表達式內input陣列每個元素的變數名稱。

  • cond:布林值表達式,決定指定的元素是否應包含在輸出陣列中。

範例 (MongoDB Shell)

下列範例示範如何使用 $filter運算子來投影每個訂單的客戶,並建立新的陣列欄位 paidItems,只包含價格大於 15 的項目陣列中的項目。基本上,它會篩選每個訂單的項目,只包含成本超過 15 的產品。

建立範例文件

db.orders.insertMany([ { _id: 1, customer: "abc123", items: [ { name: "Product A", price: 10, qty: 2 }, { name: "Product B", price: 20, qty: 1 } ]}, { _id: 2, customer: "def456", items: [ { name: "Product C", price: 5, qty: 3 }, { name: "Product D", price: 15, qty: 4 } ]}, { _id: 3, customer: "ghi789", items: [ { name: "Product E", price: 8, qty: 3 }, { name: "Product F", price: 12, qty: 1 } ]} ]);

查詢範例

db.orders.aggregate([ { $project: { customer: 1, paidItems: { $filter: { input: "$items", as: "item", cond: { $gt: ["$$item.price", 15] } } } } } ]).pretty();

輸出

[ { _id: 1, customer: 'abc123', paidItems: [ { name: 'Product B', price: 20, qty: 1 } ] }, { _id: 2, customer: 'def456', paidItems: [] }, { _id: 3, customer: 'ghi789', paidItems: [] } ]

程式碼範例

若要檢視使用 $filter命令的程式碼範例,請選擇您要使用的語言標籤:

Node.js
const { MongoClient } = require('mongodb'); async function example() { const uri = 'mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false'; const client = new MongoClient(uri); try { await client.connect(); const db = client.db('test'); const collection = db.collection('orders'); const result = await collection.aggregate([ { $project: { customer: 1, paidItems: { $filter: { input: "$items", as: "item", cond: { $gt: ["$$item.price", 15] } } } } } ]).toArray(); console.log(JSON.stringify(result, null, 2)); } catch (error) { console.error('Error:', error); } finally { await client.close(); } } example();
Python
from pymongo import MongoClient from pprint import pprint def example(): uri = 'mongodb://<username>:<password>@<cluster-endpoint>:27017/?tls=true&tlsCAFile=global-bundle.pem&replicaSet=rs0&readPreference=secondaryPreferred&retryWrites=false' with MongoClient(uri) as client: db = client.test collection = db.orders result = list(collection.aggregate([ { '$project': { 'customer': 1, 'paidItems': { '$filter': { 'input': '$items', 'as': 'item', 'cond': { '$gt': ['$$item.price', 15] } } } } } ])) for doc in result: pprint(doc) example()