Docs Menu

λ¬Έμ„œμ˜ λ°°μ—΄ μ—…λ°μ΄νŠΈ

이번 κ°€μ΄λ“œμ—μ„œλŠ” MongoDB Java λ“œλΌμ΄λ²„λ‘œ λ¬Έμ„œμ—μ„œ 배열을 μ—…λ°μ΄νŠΈν•˜λŠ” 방법을 μ•Œμ•„λ΄…λ‹ˆλ‹€.

배열을 μ—…λ°μ΄νŠΈν•˜λ €λ©΄ λ‹€μŒμ„ μˆ˜ν–‰ν•΄μ•Ό ν•©λ‹ˆλ‹€.

  • μˆ˜ν–‰ν•  μ—…λ°μ΄νŠΈ 지정

  • μ—…λ°μ΄νŠΈλ₯Ό μ μš©ν•  λ°°μ—΄ μš”μ†Œ 지정

  • λ‹€μŒ 사양을 μ‚¬μš©ν•˜μ—¬ μ—…λ°μ΄νŠΈ μž‘μ—… μˆ˜ν–‰

λ‹€μŒ μ„Ήμ…˜μ—μ„œλŠ” 이 μƒ˜ν”Œ λ¬Έμ„œλ₯Ό μ—…λ°μ΄νŠΈν•˜λŠ” 예λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

{ "_id": 1, "color": "green", "qty": [8, 12, 18] }

이 νŽ˜μ΄μ§€μ˜ μ˜ˆμ œμ—μ„œλŠ” MongoCollection 클래슀의 findOneAndUpdate() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμ„œ λ₯Ό 쑰회 ν•˜κ³  μ—…λ°μ΄νŠΈ ν•©λ‹ˆλ‹€. 각 μ˜ˆμ‹œ μ—μ„œλŠ” FindOneAndUpdateOptions 클래슀의 μΈμŠ€ν„΄μŠ€ λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—…λ°μ΄νŠΈ κ°€ λ°œμƒν•œ ν›„ MongoDB κ°€ λ¬Έμ„œ λ₯Ό 쑰회 ν•˜λ„λ‘ ν•©λ‹ˆλ‹€. findOneAndUpdate() λ©”μ„œλ“œμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ 볡합 μ—°μ‚° κ°€μ΄λ“œ λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

μ—…λ°μ΄νŠΈλ₯Ό μ§€μ •ν•˜λ €λ©΄ Updates λΉŒλ”λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. Updates λΉŒλ”λŠ” μ—…λ°μ΄νŠΈ 사양을 κ΅¬μ„±ν•˜λŠ” 정적 μœ ν‹Έλ¦¬ν‹° λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. λ°°μ—΄κ³Ό ν•¨κ»˜ Updates λΉŒλ”λ₯Ό μ‚¬μš©ν•˜λŠ” 방법에 λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ μ—…λ°μ΄νŠΈ λΉŒλ” κ°€μ΄λ“œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

λ‹€μŒ μ˜ˆμ‹œμ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • μƒ˜ν”Œ λ¬Έμ„œμ— λŒ€ν•œ 쿼리

  • 쿼리 필터와 μΌμΉ˜ν•˜λŠ” λ¬Έμ„œμ˜ qty 배열에 '17'을 μΆ”κ°€

Bson filter = Filters.eq("_id", 1);
Bson update = Updates.push("qty", 17);
FindOneAndUpdateOptions options = new FindOneAndUpdateOptions()
.returnDocument(ReturnDocument.AFTER);
Document result = collection.findOneAndUpdate(filter, update, options);
System.out.println(result.toJson());

μ•žμ˜ μ˜ˆμ—μ„œλŠ” 원본 λ¬Έμ„œλ₯Ό λ‹€μŒ μƒνƒœλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:

{ "_id": 1, "color": "green", "qty": [8, 12, 18, 17] }

μ—…λ°μ΄νŠΈν•  λ°°μ—΄ μš”μ†Œλ₯Ό μ§€μ •ν•˜λ €λ©΄ μœ„μΉ˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μœ„μΉ˜ μ—°μ‚°μžλŠ” μ—…λ°μ΄νŠΈν•  첫 번째, 전체 λ˜λŠ” νŠΉμ • λ°°μ—΄ μš”μ†Œλ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

μœ„μΉ˜ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μ§€μ •ν•˜λ €λ©΄ 점 ν‘œκΈ°λ²•μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. 점 ν‘œκΈ°λ²•μ€ BSON 객체λ₯Ό νƒμƒ‰ν•˜κΈ° μœ„ν•œ 속성 μ•‘μ„ΈμŠ€ κ΅¬λ¬Έμž…λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ 점 ν‘œκΈ°λ²•μ— λŒ€ν•œ MongoDB Server μˆ˜λ™ μž…λ ₯ ν•­λͺ©μ„ μ°Έμ‘°ν•˜μ„Έμš”.

쿼리 필터와 μΌμΉ˜ν•˜λŠ” 첫 번째 λ°°μ—΄ μš”μ†Œλ₯Ό μ—…λ°μ΄νŠΈν•˜λ €λ©΄ μœ„μΉ˜ $ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μœ„μΉ˜ $ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜λ €λ©΄ λ°°μ—΄ ν•„λ“œκ°€ 쿼리 ν•„ν„°μ˜ μΌλΆ€λ‘œ λ‚˜νƒ€λ‚˜μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ‹œμ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • κ°’ '18'을 ν¬ν•¨ν•˜λŠ” qty ν•„λ“œκ°€ μžˆλŠ” λ¬Έμ„œλ₯Ό 쿼리

  • 쿼리 필터와 μΌμΉ˜ν•˜λŠ” λ¬Έμ„œμ˜ 첫 번째 λ°°μ—΄ 값을 '3'만큼 κ°μ†Œ

Bson filter = Filters.eq("qty", 18);
Bson update = Updates.inc("qty.$", -3);
FindOneAndUpdateOptions options = new FindOneAndUpdateOptions()
.returnDocument(ReturnDocument.AFTER);
Document result = collection.findOneAndUpdate(filter, update, options);
System.out.println(result.toJson());

μ•žμ˜ μ˜ˆμ—μ„œλŠ” 원본 λ¬Έμ„œλ₯Ό λ‹€μŒ μƒνƒœλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:

{ "_id": 1, "color": "green", "qty": [8, 12, 15] }

이 μ„Ήμ…˜μ— μ–ΈκΈ‰λœ λ©”μ„œλ“œ 및 μ—°μ‚°μžμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

λ°°μ—΄μ˜ λͺ¨λ“  μš”μ†Œλ₯Ό μ—…λ°μ΄νŠΈν•˜λ €λ©΄ λͺ¨λ“  μœ„μΉ˜ $[] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ‹œμ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • μƒ˜ν”Œ λ¬Έμ„œμ— λŒ€ν•œ 쿼리

  • 쿼리 필터와 μΌμΉ˜ν•˜λŠ” λ°°μ—΄ μš”μ†Œμ— '2'λ₯Ό 곱함

Bson filter = Filters.eq("_id", 1);
Bson update = Updates.mul("qty.$[]", 2);
FindOneAndUpdateOptions options = new FindOneAndUpdateOptions()
.returnDocument(ReturnDocument.AFTER);
Document result = collection.findOneAndUpdate(filter, update, options);
System.out.println(result.toJson());

μ•žμ˜ μ˜ˆμ—μ„œλŠ” 원본 λ¬Έμ„œλ₯Ό λ‹€μŒ μƒνƒœλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:

{ "_id": 1, "color": "green", "qty": [16, 24, 36] }

이 μ„Ήμ…˜μ— μ–ΈκΈ‰λœ λ©”μ„œλ“œ 및 μ—°μ‚°μžμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

필터와 μΌμΉ˜ν•˜λŠ” λ°°μ—΄ μš”μ†Œλ₯Ό μ—…λ°μ΄νŠΈν•˜λ €λ©΄ ν•„ν„°λ§λœ μœ„μΉ˜ $[<identifier>] μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ„Έμš”. μ—…λ°μ΄νŠΈν•  λ°°μ—΄ μš”μ†Œλ₯Ό μ§€μ •ν•˜λ €λ©΄ μ—…λ°μ΄νŠΈ μž‘μ—…μ— λ°°μ—΄ ν•„ν„°λ₯Ό 포함해야 ν•©λ‹ˆλ‹€.

<identifier>은(λŠ”) λ°°μ—΄ 필터에 μ§€μ •ν•˜λŠ” μ΄λ¦„μž…λ‹ˆλ‹€. 이 값은 μ†Œλ¬Έμžλ‘œ μ‹œμž‘ν•΄μ•Ό ν•˜λ©° 영숫자만 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ μ˜ˆμ‹œμ—μ„œλŠ” μ΄λŸ¬ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

  • μƒ˜ν”Œ λ¬Έμ„œμ— λŒ€ν•œ 쿼리

  • '15'보닀 μž‘μ€ 값을 κ²€μƒ‰ν•˜λ„λ‘ λ°°μ—΄ ν•„ν„°λ₯Ό μ„€μ •ν•©λ‹ˆλ‹€.

  • 쿼리 필터와 μΌμΉ˜ν•˜λŠ” λ°°μ—΄ μš”μ†Œλ₯Ό '5'만큼 μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

Bson filter = Filters.eq("_id", 1);
Bson smallerFilter = Filters.lt("smaller", 15);
FindOneAndUpdateOptions options = new FindOneAndUpdateOptions()
.returnDocument(ReturnDocument.AFTER)
.arrayFilters(Arrays.asList(smallerFilter));
Bson update = Updates.inc("qty.$[smaller]", 5);
Document result = collection.findOneAndUpdate(filter, update, options);
System.out.println(result.toJson());

μ•žμ˜ μ˜ˆμ—μ„œλŠ” 원본 λ¬Έμ„œλ₯Ό λ‹€μŒ μƒνƒœλ‘œ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€:

{ "_id": 1, "color": "green", "qty": [13, 17, 18] }

이 μ„Ήμ…˜μ— μ–ΈκΈ‰λœ λ©”μ„œλ“œ 및 μ—°μ‚°μžμ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ€ λ‹€μŒ λ¦¬μ†ŒμŠ€λ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.