문서 메뉴
문서 홈
/
가이드 시작

연산자 및 복합 쿼리를 사용하여 데이터 읽기

이전 읽기 가이드인 쿼리를 사용하여MongoDB에서 데이터 읽기에서는 동일성 쿼리를 사용하여 데이터를 읽습니다. 이 가이드에서는 다음을 수행합니다.

  • MongoDB의 비교 연산자를 사용하여 sample_guides.planets 컬렉션에서 데이터를 읽습니다.

  • 쿼리 기준을 결합하여 복합 쿼리를 만듭니다.

  • 점 표기법을 사용하여 임베디드 필드를 쿼리합니다.

소요 시간: 10분

이 연습에서는 비교 연산자를 사용하여 데이터를 읽습니다.

1

다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.

5번째 줄에서 URI 문자열을 자체 Atlas 연결 문자열로 대체합니다.

CrudRead.cs
1using MongoDB.Bson;
2using MongoDB.Driver;
3
4// Replace the uri string with your MongoDB deployment's connection string.
5var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7var client = new MongoClient(uri);
8
9var coll = client.GetDatabase("sample_guides").GetCollection<BsonDocument>("planets");
10// find code goes here
11var cursor = coll.AsQueryable();
12
13foreach (var document in cursor)
14{
15 Console.WriteLine(document);
16}

다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.

13 줄에서 URI string을 자체 Atlas 연결 string로 바꿉니다.

crudRead.go
1package main
2
3import (
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
12func 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로 바꿉니다.

CrudRead.java
1import com.mongodb.client.*;
2import com.mongodb.client.model.Filters.*;
3import org.bson.Document;
4import org.bson.conversions.Bson;
5
6public 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 연결 문자열로 대체합니다.

crud-read.js
1const { MongoClient } = require("mongodb");
2// Replace the uri string with your MongoDB deployment's connection string.
3const uri =
4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
5const client = new MongoClient(uri);
6async 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}
20run().catch(console.dir);

다음은 MongoDB에 접속하기 위해 필요한 최소한의 코드를 간략하게 정리한 것이다. 다음 몇몇 단계에서는 데이터를 읽기 위해 추가 작업을 수행합니다.

4번째 줄에서 URI 문자열을 자체 Atlas 연결 문자열로 대체합니다.

crud_read.py
1from pymongo import MongoClient
2
3# Replace the uri string with your MongoDB deployment's connection string.
4uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"
5
6client = MongoClient(uri)
7coll = client.sample_guides.planets
8
9# find code goes here
10cursor = coll.find()
11
12for doc in cursor:
13 print(doc)
14
15# Close the connection to MongoDB when you're done.
16client.close()

mongodb+srv

PyMongo를 srv 옵션으로 설치했는지 확인합니다.

python3 -m pip install "pymongo[srv]"
2

이 쿼리에서 점 표기법 을 사용하여 내장된 문서 surfaceTemperatureCmean 필드 값이 15 도(섭씨) 미만인 문서를 선택합니다.

CrudRead.cs
// find code goes here
var cursor = from planet in coll.AsQueryable()
where planet["surfaceTemperatureC.mean"] < 15
select planet;
crudRead.go
1// find code goes here
2filter := bson.D{{"surfaceTemperatureC.mean", bson.D{{"$lt", 15}}}}
3cursor, err := coll.Find(context.TODO(), filter)
4if err != nil {
5 panic(err)
6}

MongoDB Java 드라이버에는 쿼리(및 기타 작업) 생성 프로세스를 간소화하는 빌더 가 포함되어 있습니다. 여기서는 Filters.lt 빌더를 사용하여 쿼리 문서를 구성합니다.

CrudRead.java
1// find code goes here
2Bson filter = lt("surfaceTemperatureC.mean", 15);
3MongoCursor<Document> cursor = coll.find(filter).iterator();
crud-read.js
// find code goes here
const cursor = coll.find({ "surfaceTemperatureC.mean": { $lt: 15 } });
crud_read.py
# find code goes here
cursor = coll.find({"surfaceTemperatureC.mean": {"$lt": 15}})
3

다음은 전체 코드와 샘플 출력입니다. 미관상의 이유로 결과의 일부가 표시되지 않습니다.

CrudRead.cs
1using MongoDB.Bson;
2using MongoDB.Driver;
3
4// Replace the uri string with your MongoDB deployment's connection string.
5var uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
6
7var client = new MongoClient(uri);
8
9var coll = client.GetDatabase("sample_guides").GetCollection<BsonDocument>("planets");
10// find code goes here
11var cursor = from planet in coll.AsQueryable()
12 where planet["surfaceTemperatureC.mean"] < 15
13 select planet;
14
15foreach (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 }, ... }
crudRead.go
1package main
2
3import (
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
12func 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>] ... ]
CrudRead.java
1import com.mongodb.client.*;
2import com.mongodb.client.model.Filters.*;
3import org.bson.Document;
4import org.bson.conversions.Bson;
5
6public 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 }, ... }
crud-read.js
1const { MongoClient } = require("mongodb");
2// Replace the uri string with your MongoDB deployment's connection string.
3const uri =
4 "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority";
5const client = new MongoClient(uri);
6async 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}
20run().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 }, ... }
crud_read.py
1from pymongo import MongoClient
2
3# Replace the uri string with your MongoDB deployment's connection string.
4uri = "mongodb+srv://<user>:<password>@<cluster-url>?retryWrites=true&writeConcern=majority"
5
6client = MongoClient(uri)
7coll = client.sample_guides.planets
8
9# find code goes here
10cursor = coll.find({"surfaceTemperatureC.mean": {"$lt": 15}})
11
12for doc in cursor:
13 print(doc)
14
15# Close the connection to MongoDB when you're done.
16client.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에서 데이터를 읽습니다.

1

모든 쿼리 조건자(예: 논리적 AND)와 일치하는 MongoDB의 복합 쿼리를 작성하려면 찾기 문서에서 일치시키려는 모든 필드를 지정합니다. 기본적으로 MongoDB는 모든 필드와 일치합니다. 이전 가이드를 수행했다면 이미 이 작업을 완료한 것입니다!

다음 예제에서는 surfaceTemperatureC.mean 필드가 15보다 작고 동시에 surfaceTemperatureC.min 필드가 -100보다 큰 planets 컬렉션의 모든 문서를 검색합니다.

CrudRead.cs
1// find code goes here
2var cursor = from planet in coll.AsQueryable()
3 where planet["surfaceTemperatureC.mean"] < 15 && planet["surfaceTemperatureC.min"] > -100
4 select planet;
5
{'name': 'Earth', 'orderFromSun': 3, ...}
crudRead.go
1// find code goes here
2filter := 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}
14cursor, err := coll.Find(context.TODO(), filter)
15if err != nil {
16 panic(err)
17}
map[name:Earth orderFromSun:3 ...]
CrudRead.java
1// find code goes here
2Bson filter = and(lt("surfaceTemperatureC.mean", 15), gt("surfaceTemperatureC.min", -100));
3MongoCursor<Document> cursor = coll.find(filter).iterator();
{'name': 'Earth', 'orderFromSun': 3, ...}
crud-read.js
1// find code goes here
2const 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 쿼리 연산자를 사용해야 합니다.

crud-read.js
1const cursor = coll.find({
2 $and: [{ orderFromSun: { $gt: 2 } }, { orderFromSun: { $lt: 5 } }],
3});
{'name': 'Mars', 'orderFromSun': 4, ... }
{'name': 'Earth', 'orderFromSun': 3, ... }
crud_read.py
1cursor = coll.find(
2 {"$and": [{"orderFromSun": {"$gt": 2}}, {"orderFromSun": {"$lt": 5}}]}
3)
{'name': 'Mars', 'orderFromSun': 4, ... }
{'name': 'Earth', 'orderFromSun': 3, ... }

$and 연산자를 사용하지 않는 경우 드라이버는 쿼리 필터에서 동일한 키를 여러 번 발견하고 마지막으로 발견된 키를 사용합니다. $and 연산자를 생략해 보고 어떤 결과가 나오는지 살펴보세요.

crud_read.py
1# find code goes here
2cursor = coll.find(
3 {"surfaceTemperatureC.mean": {"$lt": 15}, "surfaceTemperatureC.min": {"$gt": -100}}
4)
{'name': 'Earth', 'orderFromSun': 3, ...}

참고

암시적 AND

여러 기준을 지정하는 것이 일반적입니다. 쿼리 연산자를 지정하지 않으면 드라이버는 AND 방식으로 기준을 해석합니다. 그러나 여러 기준을 지정할 때, 특히 동일한 필드에 기준을 지정할 때 명시적이어야 하는 경우가 있습니다.

예를 들어 planets 컬렉션에서 orderFromSun 값이 2보다 크고 5보다 작은 문서를 찾으려면 $and 쿼리 연산자를 사용해야 합니다.

crud-read.js
1const cursor = coll.find({
2 $and: [{ orderFromSun: { $gt: 2 } }, { orderFromSun: { $lt: 5 } }],
3});
{'name': 'Mars', 'orderFromSun': 4, ... }
{'name': 'Earth', 'orderFromSun': 3, ... }
crud_read.py
1cursor = coll.find(
2 {"$and": [{"orderFromSun": {"$gt": 2}}, {"orderFromSun": {"$lt": 5}}]}
3)
{'name': 'Mars', 'orderFromSun': 4, ... }
{'name': 'Earth', 'orderFromSun': 3, ... }

$and 연산자를 사용하지 않는 경우 드라이버는 쿼리 필터에서 동일한 키를 여러 번 발견하고 마지막으로 발견된 키를 사용합니다. $and 연산자를 생략해 보고 어떤 결과가 나오는지 살펴보세요.

2

OR 쿼리는 상호 배타적인 기준을 지정하려는 경우에 필요합니다. 예를 들어 orderFromSun 값이 7 이상이면서 2 미만인 planets collection의 문서는 일치시킬 수 없습니다.

다음 예제에서는 $or 연산자를 사용하여 상호 배타적 기준을 표현하는 방법을 보여 줍니다.

CrudRead.cs
1// find code goes here
2var 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, ... }
crudRead.go
1// find code goes here
2filter := 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
13cursor, err := coll.Find(context.TODO(), filter)
14if err != nil {
15 panic(err)
16}
map[name:Mercury orderFromSun:1 ...]
map[name:Neptune orderFromSun:8 ...]
CrudRead.java
1// find code goes here
2Bson filter = or(gt("orderFromSun", 7), lt("orderFromSun", 2));
3MongoCursor<Document> cursor = coll.find(filter).iterator();
{ name: 'Mercury', orderFromSun: 1, ... }
{ name: 'Neptune', orderFromSun: 8, ... }
crud-read.js
1// find code goes here
2const cursor = coll.find({
3 $or: [{ orderFromSun: { $gt: 7 } }, { orderFromSun: { $lt: 2 } }],
4});
{ name: 'Mercury', orderFromSun: 1, ... }
{ name: 'Neptune', orderFromSun: 8, ... }
crud_read.py
1# find code goes here
2cursor = 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에 데이터를 삽입하는 방법을 배워봅니다.

마지막으로
몽고DB에 데이터 삽입
15분

문서를 생성하고 MongoDB에 삽입합니다.

시작 가이드
2장
CRUD
  • MongoDB 드라이버 추가
  • 몽고DB에서 데이터 읽기
  • 쿼리를 사용하여 몽고DB에서 데이터 읽기
  • 연산자 및 복합 쿼리를 사용하여 데이터 읽기
  • 몽고DB에 데이터 삽입
  • 몽고DB에서 데이터 업데이트
  • 몽고DB에서 데이터 삭제