연산자 및 복합 쿼리를 사용하여 데이터 읽기
개요
이전 읽기 가이드쿼리를 사용하여MongoDB 에서 데이터 읽기에서는 동일성 쿼리를 사용하여 데이터를 읽습니다. 이 가이드 에서는 다음을 수행합니다.
MongoDB의 비교 연산자를 사용하여
sample_guides.planets
컬렉션에서 데이터를 읽습니다.쿼리 기준을 결합하여 복합 쿼리를 만듭니다.
점 표기법을 사용하여 임베디드 필드를 쿼리합니다.
소요 시간: 10분
준비물
절차
내장된 필드 및 비교 연산자를 사용하여 데이터 읽기
이 연습에서는 비교 연산자를 사용하여 데이터를 읽습니다.
MongoDB 인스턴스에 연결합니다.
팁
다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.
5번째 줄에서 URI 문자열을 자체 Atlas 연결 문자열로 대체합니다.
1 using MongoDB.Bson;
2 using MongoDB.Driver;
3
4 // Replace the uri string with your MongoDB deployment's connection string.
5 var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7 var client = new MongoClient(uri);
8
9 var coll = client.GetDatabase("sample_guides").GetCollection<BsonDocument>("planets");
10 // find code goes here
11 var cursor = coll.AsQueryable();
12
13 foreach (var document in cursor)
14 {
15 Console.WriteLine(document);
16 }
팁
다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.
13줄에서 URI string 을 자체 Atlas 연결 string 로 바꿉니다.
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 uri := "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 14 15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) 16 if err != nil { 17 panic(err) 18 } 19 20 defer func() { 21 if err = client.Disconnect(context.TODO()); err != nil { 22 panic(err) 23 } 24 }() 25 coll := client.Database("sample_guides").Collection("planets") 26 27 // find code goes here 28 filter := bson.D{{}} 29 cursor, err := coll.Find(context.TODO(), filter) 30 if err != nil { 31 panic(err) 32 } 33 34 for cursor.Next(context.TODO()) { 35 var result bson.M 36 if err := cursor.Decode(&result); err != nil { 37 panic(err) 38 } 39 fmt.Println(result) 40 } 41 if err := cursor.Err(); err != nil { 42 panic(err) 43 } 44 }
팁
다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.
8줄에서 URI string 을 자체 Atlas 연결 string 로 바꿉니다.
1 import com.mongodb.client.*; 2 import com.mongodb.client.model.Filters.*; 3 import org.bson.Document; 4 import org.bson.conversions.Bson; 5 6 public class CrudRead { 7 public static void main(String[] args) { 8 String uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 9 10 try (MongoClient mongoClient = MongoClients.create(uri)) { 11 MongoCollection<Document> coll = mongoClient.getDatabase("sample_guides") 12 .getCollection("planets"); 13 // find code goes here 14 Bson filter = Filters.empty(); 15 MongoCursor<Document> cursor = coll.find(filter).iterator(); 16 try { 17 while (cursor.hasNext()) { 18 System.out.println(cursor.next().toJson()); 19 } 20 } finally { 21 cursor.close(); 22 } 23 } 24 } 25 }
팁
다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.
4번째 줄에서 URI 문자열을 자체 Atlas 연결 문자열로 대체합니다.
1 const { MongoClient } = require("mongodb"); 2 // Replace the uri string with your MongoDB deployment's connection string. 3 const uri = 4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 5 const client = new MongoClient(uri); 6 async function run() { 7 try { 8 await client.connect(); 9 const coll = client.db("sample_guides").collection("planets"); 10 11 // find code goes here 12 let cursor = coll.find(); 13 14 await cursor.forEach(console.log); 15 } finally { 16 // Ensures that the client will close when you finish/error 17 await client.close(); 18 } 19 } 20 run().catch(console.dir);
팁
다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.
4번째 줄에서 URI 문자열을 자체 Atlas 연결 문자열로 대체합니다.
1 from pymongo import MongoClient 2 3 # Replace the uri string with your MongoDB deployment's connection string. 4 uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 5 6 client = MongoClient(uri) 7 coll = client.sample_guides.planets 8 9 # find code goes here 10 cursor = coll.find() 11 12 for doc in cursor: 13 print(doc) 14 15 # Close the connection to MongoDB when you're done. 16 client.close()
팁
mongodb+srv
PyMongo를 srv
옵션으로 설치했는지 확인합니다.
python3 -m pip install "pymongo[srv]"
Less-than 연산자를 사용하여 문서를 선택합니다.
이 쿼리 에서 점 표기법 을 사용하여 내장된 문서 surfaceTemperatureC
의 mean
필드 값이 15 도(섭씨) 미만인 문서를 선택합니다.
// find code goes here
var cursor = from planet in coll.AsQueryable()
where planet["surfaceTemperatureC.mean"] < 15
select planet;
1 // find code goes here 2 filter := bson.D{{"surfaceTemperatureC.mean", bson.D{{"$lt", 15}}}} 3 cursor, err := coll.Find(context.TODO(), filter) 4 if err != nil { 5 panic(err) 6 }
MongoDB Java 드라이버 에는 쿼리(및 기타 작업) 생성 프로세스 를 간소화하는 빌더 가 포함되어 있습니다. 여기서는 Filters.lt
빌더를 사용하여 쿼리 문서 를 구성합니다.
1 // find code goes here 2 Bson filter = lt("surfaceTemperatureC.mean", 15); 3 MongoCursor<Document> cursor = coll.find(filter).iterator();
// find code goes here const cursor = coll.find({ "surfaceTemperatureC.mean": { $lt: 15 } });
# find code goes here cursor = coll.find({"surfaceTemperatureC.mean": {"$lt": 15}})
결과를 확인합니다.
다음은 전체 코드와 샘플 출력입니다. 미관상의 이유로 결과의 일부가 표시되지 않습니다.
1 using MongoDB.Bson;
2 using MongoDB.Driver;
3
4 // Replace the uri string with your MongoDB deployment's connection string.
5 var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7 var client = new MongoClient(uri);
8
9 var coll = client.GetDatabase("sample_guides").GetCollection<BsonDocument>("planets");
10 // find code goes here
11 var cursor = from planet in coll.AsQueryable()
12 where planet["surfaceTemperatureC.mean"] < 15
13 select planet;
14
15 foreach (var document in cursor)
16 {
17 Console.WriteLine(document);
18 }
{ "name" : "Uranus", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -197.19999999999999 }, ... } { "name" : "Mars", "surfaceTemperatureC" : { "min" : -143, "max" : 35, "mean" : -63 }, ... } { "name" : "Neptune", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -201 }, ... } { "name" : "Jupiter", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -145.15000000000001 }, ... } { "name" : "Earth", "surfaceTemperatureC" : { "min" : -89.200000000000003, "max" : 56.700000000000003, "mean" : 14 }, ... } { "name" : "Saturn", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -139.15000000000001 }, ... }
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 uri := "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 14 15 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(uri)) 16 if err != nil { 17 panic(err) 18 } 19 20 defer func() { 21 if err = client.Disconnect(context.TODO()); err != nil { 22 panic(err) 23 } 24 }() 25 coll := client.Database("sample_guides").Collection("planets") 26 27 // find code goes here 28 filter := bson.D{{"surfaceTemperatureC.mean", bson.D{{"$lt", 15}}}} 29 cursor, err := coll.Find(context.TODO(), filter) 30 if err != nil { 31 panic(err) 32 } 33 34 for cursor.Next(context.TODO()) { 35 var result bson.M 36 if err := cursor.Decode(&result); err != nil { 37 panic(err) 38 } 39 fmt.Println(result) 40 } 41 if err := cursor.Err(); err != nil { 42 panic(err) 43 } 44 }
map[ name:Uranus surfaceTemperatureC:map[max:<nil> mean:-197.2 min:<nil>] ...] map[ name:Mars surfaceTemperatureC:map[max:35 mean:-63 min:-143] ... ] map[ name:Neptune surfaceTemperatureC:map[max:<nil> mean:-201 min:<nil>] ... ] map[ name:Jupiter surfaceTemperatureC:map[max:<nil> mean:-145.15 min:<nil>] ... ] map[ name:Earth surfaceTemperatureC:map[max:56.7 mean:14 min:-89.2]] map[ name:Saturn surfaceTemperatureC:map[max:<nil> mean:-139.15 min:<nil>] ... ]
1 import com.mongodb.client.*; 2 import com.mongodb.client.model.Filters.*; 3 import org.bson.Document; 4 import org.bson.conversions.Bson; 5 6 public class CrudRead { 7 public static void main(String[] args) { 8 String uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 9 10 try (MongoClient mongoClient = MongoClients.create(uri)) { 11 MongoCollection<Document> coll = mongoClient.getDatabase("sample_guides") 12 .getCollection("planets"); 13 14 // find code goes here 15 Bson filter = lt("surfaceTemperatureC.mean", 15); 16 MongoCursor<Document> cursor = coll.find(filter).iterator(); 17 18 // iterate code goes here 19 try { 20 while (cursor.hasNext()) { 21 System.out.println(cursor.next().toJson()); 22 } 23 } finally { 24 cursor.close(); 25 } 26 } 27 } 28 }
{ "name" : "Uranus", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -197.19999999999999 }, ... } { "name" : "Mars", "surfaceTemperatureC" : { "min" : -143, "max" : 35, "mean" : -63 }, ... } { "name" : "Neptune", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -201 }, ... } { "name" : "Jupiter", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -145.15000000000001 }, ... } { "name" : "Earth", "surfaceTemperatureC" : { "min" : -89.200000000000003, "max" : 56.700000000000003, "mean" : 14 }, ... } { "name" : "Saturn", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -139.15000000000001 }, ... }
1 const { MongoClient } = require("mongodb"); 2 // Replace the uri string with your MongoDB deployment's connection string. 3 const uri = 4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"; 5 const client = new MongoClient(uri); 6 async function run() { 7 try { 8 await client.connect(); 9 const coll = client.db("sample_guides").collection("planets"); 10 11 // find code goes here 12 const cursor = coll.find({ "surfaceTemperatureC.mean": { $lt: 15 } }); 13 14 await cursor.forEach(console.log); 15 } finally { 16 // Ensures that the client will close when you finish/error 17 await client.close(); 18 } 19 } 20 run().catch(console.dir);
{ "name" : "Uranus", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -197.19999999999999 }, ... } { "name" : "Mars", "surfaceTemperatureC" : { "min" : -143, "max" : 35, "mean" : -63 }, ... } { "name" : "Neptune", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -201 }, ... } { "name" : "Jupiter", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -145.15000000000001 }, ... } { "name" : "Earth", "surfaceTemperatureC" : { "min" : -89.200000000000003, "max" : 56.700000000000003, "mean" : 14 }, ... } { "name" : "Saturn", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -139.15000000000001 }, ... }
1 from pymongo import MongoClient 2 3 # Replace the uri string with your MongoDB deployment's connection string. 4 uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority" 5 6 client = MongoClient(uri) 7 coll = client.sample_guides.planets 8 9 # find code goes here 10 cursor = coll.find({"surfaceTemperatureC.mean": {"$lt": 15}}) 11 12 for doc in cursor: 13 print(doc) 14 15 # Close the connection to MongoDB when you're done. 16 client.close()
{ "name" : "Uranus", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -197.19999999999999 }, ... } { "name" : "Mars", "surfaceTemperatureC" : { "min" : -143, "max" : 35, "mean" : -63 }, ... } { "name" : "Neptune", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -201 }, ... } { "name" : "Jupiter", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -145.15000000000001 }, ... } { "name" : "Earth", "surfaceTemperatureC" : { "min" : -89.200000000000003, "max" : 56.700000000000003, "mean" : 14 }, ... } { "name" : "Saturn", "surfaceTemperatureC" : { "min" : null, "max" : null, "mean" : -139.15000000000001 }, ... }
복합 쿼리로 데이터 읽기
이제 복합 쿼리를 구성하기 위해 AND 및 OR 논리를 사용하여 MongoDB에서 데이터를 읽습니다.
AND 쿼리를 작성합니다.
모든 쿼리 조건자(예: 논리적 AND)와 일치하는 MongoDB의 복합 쿼리를 작성하려면 찾기 문서에서 일치시키려는 모든 필드를 지정합니다. 기본적으로 MongoDB는 모든 필드와 일치합니다. 이전 가이드를 수행했다면 이미 이 작업을 완료한 것입니다!
다음 예제에서는 surfaceTemperatureC.mean
필드가 15
보다 작고 동시에 surfaceTemperatureC.min
필드가 -100
보다 큰 planets
컬렉션의 모든 문서를 검색합니다.
1 // find code goes here
2 var cursor = from planet in coll.AsQueryable()
3 where planet["surfaceTemperatureC.mean"] < 15 && planet["surfaceTemperatureC.min"] > -100
4 select planet;
5
{'name': 'Earth', 'orderFromSun': 3, ...}
1 // find code goes here 2 filter := bson.D{ 3 {"$and", 4 bson.A{ 5 bson.D{{"surfaceTemperatureC.mean", 6 bson.D{{"$lt", 15}}, 7 }}, 8 bson.D{{"surfaceTemperatureC.min", 9 bson.D{{"$gt", -100}}, 10 }}, 11 }, 12 }, 13 } 14 cursor, err := coll.Find(context.TODO(), filter) 15 if err != nil { 16 panic(err) 17 }
map[name:Earth orderFromSun:3 ...]
1 // find code goes here 2 Bson filter = and(lt("surfaceTemperatureC.mean", 15), gt("surfaceTemperatureC.min", -100)); 3 MongoCursor<Document> cursor = coll.find(filter).iterator();
{'name': 'Earth', 'orderFromSun': 3, ...}
1 // find code goes here 2 const cursor = coll.find({ 3 "surfaceTemperatureC.mean": { $lt: 15 }, 4 "surfaceTemperatureC.min": { $gt: -100 }, 5 });
{'name': 'Earth', 'orderFromSun': 3, ...}
참고
암시적 AND
여러 기준을 지정하는 것이 일반적입니다. 쿼리 연산자를 지정하지 않으면 드라이버는 AND 방식으로 기준을 해석합니다. 그러나 여러 기준을 지정할 때, 특히 동일한 필드에 기준을 지정할 때 명시적이어야 하는 경우가 있습니다.
예를 들어 planets
컬렉션에서 orderFromSun
값이 2
보다 크고 5
보다 작은 문서를 찾으려면 $and
쿼리 연산자를 사용해야 합니다.
1 const cursor = coll.find({ 2 $and: [{ orderFromSun: { $gt: 2 } }, { orderFromSun: { $lt: 5 } }], 3 });
{'name': 'Mars', 'orderFromSun': 4, ... } {'name': 'Earth', 'orderFromSun': 3, ... }
1 cursor = coll.find( 2 {"$and": [{"orderFromSun": {"$gt": 2}}, {"orderFromSun": {"$lt": 5}}]} 3 )
{'name': 'Mars', 'orderFromSun': 4, ... } {'name': 'Earth', 'orderFromSun': 3, ... }
$and
연산자를 사용하지 않는 경우 드라이버는 쿼리 필터에서 동일한 키를 여러 번 발견하고 마지막으로 발견된 키를 사용합니다. $and
연산자를 생략해 보고 어떤 결과가 나오는지 살펴보세요.
1 # find code goes here 2 cursor = coll.find( 3 {"surfaceTemperatureC.mean": {"$lt": 15}, "surfaceTemperatureC.min": {"$gt": -100}} 4 )
{'name': 'Earth', 'orderFromSun': 3, ...}
참고
암시적 AND
여러 기준을 지정하는 것이 일반적입니다. 쿼리 연산자를 지정하지 않으면 드라이버는 AND 방식으로 기준을 해석합니다. 그러나 여러 기준을 지정할 때, 특히 동일한 필드에 기준을 지정할 때 명시적이어야 하는 경우가 있습니다.
예를 들어 planets
컬렉션에서 orderFromSun
값이 2
보다 크고 5
보다 작은 문서를 찾으려면 $and
쿼리 연산자를 사용해야 합니다.
1 const cursor = coll.find({ 2 $and: [{ orderFromSun: { $gt: 2 } }, { orderFromSun: { $lt: 5 } }], 3 });
{'name': 'Mars', 'orderFromSun': 4, ... } {'name': 'Earth', 'orderFromSun': 3, ... }
1 cursor = coll.find( 2 {"$and": [{"orderFromSun": {"$gt": 2}}, {"orderFromSun": {"$lt": 5}}]} 3 )
{'name': 'Mars', 'orderFromSun': 4, ... } {'name': 'Earth', 'orderFromSun': 3, ... }
$and
연산자를 사용하지 않는 경우 드라이버는 쿼리 필터에서 동일한 키를 여러 번 발견하고 마지막으로 발견된 키를 사용합니다. $and
연산자를 생략해 보고 어떤 결과가 나오는지 살펴보세요.
OR 쿼리를 작성합니다.
OR 쿼리는 상호 배타적인 기준을 지정하려는 경우에 필요합니다. 예를 들어 orderFromSun
값이 7
이상이면서 2
미만인 planets
collection의 문서는 일치시킬 수 없습니다.
다음 예시에서는 $or
연산자를 사용하여 상호 배타적 기준을 표현하는 방법을 보여 줍니다.
1 // find code goes here
2 var cursor = from planet in coll.AsQueryable()
3 where planet["orderFromSun"] > 7 || planet["orderFromSun"] < 2
4 select planet;
{ name: 'Mercury', orderFromSun: 1, ... } { name: 'Neptune', orderFromSun: 8, ... }
1 // find code goes here 2 filter := bson.D{ 3 {"$or", 4 bson.A{ 5 bson.D{{"orderFromSun", 6 bson.D{{"$gt", 7}}, 7 }}, 8 bson.D{{"orderFromSun", bson.D{{"$lt", 2}}}}, 9 }, 10 }, 11 } 12 13 cursor, err := coll.Find(context.TODO(), filter) 14 if err != nil { 15 panic(err) 16 }
map[name:Mercury orderFromSun:1 ...] map[name:Neptune orderFromSun:8 ...]
1 // find code goes here 2 Bson filter = or(gt("orderFromSun", 7), lt("orderFromSun", 2)); 3 MongoCursor<Document> cursor = coll.find(filter).iterator();
{ name: 'Mercury', orderFromSun: 1, ... } { name: 'Neptune', orderFromSun: 8, ... }
1 // find code goes here 2 const cursor = coll.find({ 3 $or: [{ orderFromSun: { $gt: 7 } }, { orderFromSun: { $lt: 2 } }], 4 });
{ name: 'Mercury', orderFromSun: 1, ... } { name: 'Neptune', orderFromSun: 8, ... }
1 # find code goes here 2 cursor = coll.find( 3 { 4 "$or": [ 5 {"orderFromSun": {"$gt": 7}}, 6 {"orderFromSun": {"$lt": 2}}, 7 ] 8 } 9 )
{ name: 'Mercury', orderFromSun: 1, ... } { name: 'Neptune', orderFromSun: 8, ... }
요약
이 가이드를 성공적으로 완료했다면 MongoDB 쿼리 연산자와 복합 쿼리를 사용하여 MongoDB에서 데이터를 읽은 것입니다.
쿼리 연산자를 거의 무한한 방식으로 조합하여 복합 쿼리를 표현할 수 있습니다. 예를 들어 대기 중에 고리와 특정 화합물이 있거나 특정 온도이고 이름에 'E'가 들어가는 문서를 쿼리할 수 있습니다.
다음 가이드에서는 MongoDB에 데이터를 삽입하는 방법을 배워봅니다.