Mongoose: mongodb์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ˆ˜์ง‘ ๋ฐฉ๋ฒ•

์— ๋งŒ๋“  2018๋…„ 08์›” 17์ผ  ยท  28์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Automattic/mongoose

๊ธฐ๋Šฅ ์„ ์š”์ฒญํ•˜๊ฑฐ๋‚˜ ๋ฒ„๊ทธ ๋ฅผ ๋ณด๊ณ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋ฒŒ๋ ˆ

ํ˜„์žฌ ํ–‰๋™์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

Model.findByIdAndUpdate()๋Š” collection.findAndModify๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” mongodb์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค. Mongodb๋Š” ๋Œ€์‹  findOneAndUpdate, findOneAndReplace ๋˜๋Š” findOneAndDelete๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

collection.ensureIndex๋„ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. mongodb๋Š” ๋Œ€์‹  createIndexes๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋™์ž‘์ด ๋ฒ„๊ทธ์ธ ๊ฒฝ์šฐ ์žฌํ˜„ ๋‹จ๊ณ„๋ฅผ ์ œ๊ณตํ•˜์‹ญ์‹œ์˜ค.

Model.findByIdAndUpdate / findOneAndUpdate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ  ์—†์Œ!

node.js, mongoose ๋ฐ MongoDB ๋ฒ„์ „์„ ์–ธ๊ธ‰ํ•˜์‹ญ์‹œ์˜ค.

๋…ธ๋“œ v10.8.0
๋ชฝ๊ณ DB v3.6.2
๋ชฝ๊ตฌ์Šค v5.2.9

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ "์ฐพ๊ธฐ ์˜ต์…˜ [ํ•„๋“œ]๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ดํ›„ ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค."๋ผ๋Š” ๋ฉ”์‹œ์ง€๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  28 ๋Œ“๊ธ€

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ "์ฐพ๊ธฐ ์˜ต์…˜ [ํ•„๋“œ]๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ดํ›„ ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค."๋ผ๋Š” ๋ฉ”์‹œ์ง€๋„ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

(node:13076) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:13076) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:13076) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:13076) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.

์—ฌ๊ธฐ ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ด ์žˆ์Šต๋‹ˆ๋‹ค.

#6165์™€ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ CI ํ…Œ์ŠคํŠธ ์—์„œ ์žฌํ˜„ ๊ฐ€๋Šฅ

๋ถ€๋ถ„ ์ง€์› ์ค‘๋‹จ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐฉ์ง€ ํ•˜๋ ค๋ฉด useFindAndModify ๋ฅผ false๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. IMO ์ด์ œ ๊ธฐ๋ณธ๊ฐ’์ด false์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

mongoose.set('useFindAndModify', false);

๊ฒฝ๊ณ : ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ ์—†์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์ด ์˜ต์…˜์„ false๋กœ ์„ค์ •ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ทธ๋Ÿฌ๋‚˜ ensureIndex(es) ๋ฐ update $์™€ ๊ฐ™์€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋„ ์ƒˆ API๋กœ ๋Œ€์ฒดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ต์…˜์„ false๋กœ ์„ค์ •ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์—…๋ฐ์ดํŠธํ•˜๊ณ  useFindAndModify ์˜ต์…˜์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋ฉ”๋ชจ:
MongoDB 3.2+๋งŒ findOneAndUpdate ์‹œ๋ฆฌ์ฆˆ ์ฟผ๋ฆฌ๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ ๊ธฐ๋ณธ [email protected] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ findAndModify ํด๋ฆฌํ•„์„ ์‚ฌ์šฉํ•˜์—ฌ 2.6์œผ๋กœ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ ํ•˜๋ฏ€๋กœ useFindAndModify ๊ธฐ๋ณธ๊ฐ’์„ false๋กœ ์„ค์ •ํ•ด๋„ ํ˜„์žฌ MongoDB 3.0์— ๋Œ€ํ•œ ์ง€์›์ด ์‹ค์ œ๋กœ ์ค‘๋‹จ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด ํ˜ธํ™˜์„ฑ์€ [email protected] (์•„์ฃผ ์˜ค๋ž˜์ „) ์ดํ›„๋กœ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋˜๊ณ  ์ด์ œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณง ์ค‘๋‹จ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ mongoose(6.x)์˜ ๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” MongoDB 3.0 ์ง€์›์„ ์ค‘๋‹จํ•˜๊ณ  ๋ชจ๋“  ์ƒˆ๋กœ์šด API๋ฅผ ์ฑ„ํƒํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, MongoDB 3.0์€ ๋ฐ˜๋…„ ์ „์ธ 2018๋…„ 2์›”์— ๋‹จ์ข…์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒฌ์žˆ๋Š” ์‚ฌ๋žŒ?

๊ทธ๋ž˜์„œ ... ์™œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋‹ค์Œ ๋ชฝ๊ตฌ์Šค ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ?

@lpiVasquez ๋ฌธ์„œ์— mongoose 5.x๊ฐ€ MongoDB Server 3.0์„ ์ง€์›ํ•œ๋‹ค๊ณ  ๋‚˜์™€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ API๊ฐ€ ์—ฌ์ „ํžˆ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์ง€๊ธˆ์€ ์ƒˆ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ด ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ ๋งค์šฐ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๋ง์€ ๋ฌธ์ œ๋ฅผ ๋ฌด์‹œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค 5.3์—์„œ MongoDB Server 3.0์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ 5.2์—์„œ๋Š” ์ค‘๋‹จํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋‹ค๋งŒ ์ œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค.

@IpiVasquez

์— ์˜ํ•ด,

์™œ ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

๋„ค ๋ง ๋œป์€,

mongodb๊ฐ€ ์ด๋Ÿฌํ•œ API๋ฅผ ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ 

Mongodb๋Š” ๋‹ค์–‘ํ•œ ๋“œ๋ผ์ด๋ฒ„ API๋ฅผ ๋ณด๋‹ค ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ณ„ํš์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ mongodb crud ์‚ฌ์–‘์— ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ชฝ๊ตฌ์Šค ๋ฉ”์ด์ € ๋ฆด๋ฆฌ์Šค๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๊นŒ?

semver ์‚ฌ์–‘ ์„ ๊ณ ์ˆ˜ํ•œ๋‹ค๋ฉด @5.3.0 ์™€ ๊ฐ™์€ ๋งˆ์ด๋„ˆ ๋ฆด๋ฆฌ์Šค ๋˜๋Š” @5.2.10 ์™€ ๊ฐ™์€ ํŒจ์น˜ ๋ฆด๋ฆฌ์Šค์™€ ๋Œ€์กฐ์ ์œผ๋กœ @6.0.0 ์™€ ๊ฐ™์€ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์—์„œ API๋ฅผ ๊นจ๋œจ๋ฆฌ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @5.2.10 .

๊ธฐ๋ณธ ๋“œ๋ผ์ด๋ฒ„์˜ ์—ญ์‚ฌ๋ฅผ ๋˜๋Œ์•„๋ณด๋ฉด ๋“œ๋ผ์ด๋ฒ„์˜ v4๊นŒ์ง€ ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ฑฐํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋™์•ˆ ๋‚ด๊ฐ€ ๋ณธ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์™„ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์˜ ๋Œ€๋ถ€๋ถ„์€ ๋ชฝ๊ตฌ์Šค @6.0.0 ์—์„œ ์ œ๊ฑฐ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ mongoose์—์„œ ๋” ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  2๊ฐ€์ง€ ์ฃผ์š” ๋ฌธ์ œ๋Š” ์ฟผ๋ฆฌ ์˜ต์…˜์—์„œ projections ๋ฅผ fields ๋กœ ๋Œ€์ฒดํ•˜๊ณ (์ตœ์†Œํ•œ ์„œ๋ฒ„ ๋ฒ„์ „ 3.0.15๋กœ ๋‹ค์‹œ ์ž‘๋™) ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. @Fonger ๊ฐ€ ์„ค๋ช…ํ•˜๋Š” useFindAndModify ์˜ ๊ธฐ๋ณธ๊ฐ’์€ ํ•˜๋‚˜์˜ ๋ถ€๋ก์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋„ค์ดํ‹ฐ๋ธŒ ๋“œ๋ผ์ด๋ฒ„์˜ findOneAndUpdate๋Š” 3.2 ์ด์ „ ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ findAndModify๋ฅผ ํ˜ธ์ถœํ•˜๋ฏ€๋กœ(์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ  ์—†์ด) mongoose์˜ findOneAndUpdate ๋Š” ์—ฌ์ „ํžˆ mongodb 3.2 ๋ฐ useFindAndModify: false ์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ ๋ณด์—ฌ์ฃผ๋“ฏ์ด:

6880.js

#!/usr/bin/env node
'use strict';

const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);

const url = 'mongodb://localhost:27017/test';
const opts = { useNewUrlParser: true };

mongoose.connect(url, opts);
const conn = mongoose.connection;
const Schema = mongoose.Schema;

const schema = new Schema({
  name: String
});

const Test = mongoose.model('test', schema);

async function run() {
  await conn.dropDatabase();
  let admin = conn.db.admin();
  let { version } = await admin.serverInfo();
  console.log(`mongodb: ${version}`);
  console.log(`mongoose: ${mongoose.version}`);

  let cond = {};
  let update = { name: 'Sarah' };
  let opts = {
    upsert: true,
    new: true
  };

  let sarah = await Test.findOneAndUpdate(cond, update, opts);
  console.log(sarah);
  return conn.close();
}

run();

์‚ฐ์ถœ:

issues: ./6880.js
mongodb: 3.0.15
mongoose: 5.2.9
{ _id: 5b779ca8d1326ce227b6869f, __v: 0, name: 'Sarah' }
issues:

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ธฐ๋ณธ ๋“œ๋ผ์ด๋ฒ„๋งŒ์œผ๋กœ ์ด๋ฅผ ์‹œ์—ฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

6880_๋„ค์ดํ‹ฐ๋ธŒ.js

#!/usr/bin/env node
'use strict';

const { MongoClient, Logger } = require('mongodb');

const uri = 'mongodb://localhost:27017/test';
const opts = { 
  useNewUrlParser: true
};

async function run() {
  const client = new MongoClient(uri, opts);
  await client.connect();
  const db = client.db('gh-6881');
  await db.dropDatabase().catch(handleError);

  Logger.setLevel('debug');
  let res = await db
    .collection('tests')
    .findOneAndUpdate({}, { $set: { name: 'michael' } }, { upsert: true })
    .catch(handleError);
  Logger.setLevel('error');
  console.log(res);
  let doc = await db
    .collection('tests')
    .findOne({})
    .catch(handleError);

  console.log(doc);
  process.exit(0);
}

run();

function handleError(e) {
  return console.error(e.message);
}

์ž˜๋ฆฐ ์ถœ๋ ฅ:

...
message: 'executing command [{"ns":"gh-6881.$cmd","cmd":{"findAndModify":"tests","query":{},"new":false,"remove":false,"upsert":true,"update":{"$set":{"name":"michael"}}},"options":{}}] against localhost:27017',
...
{ value: null,
  lastErrorObject:
   { updatedExisting: false,
     n: 1,
     upserted: 5b77a23cd1326ce227b686a1 },
  ok: 1 }
{ _id: 5b77a23cd1326ce227b686a1, name: 'michael' }

์—ฌ๊ธฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ๋‹ค์Œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

(node:9856) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:9856) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.

์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€ ๊ท€์ฐฎ๋‹ค๋ฉด _ ์ž„์‹œ_ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์œผ๋กœ --no-deprecation ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ cli์—์„œ node.js ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์€ _๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค_.

๋‚˜์™€ ํ•จ๊ป˜:

 (node:1) DeprecationWarning: collection.findAndModify is deprecated. Use findOneAndUpdate, findOneAndReplace or findOneAndDelete instead.
 (node:1) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
(node:1) DeprecationWarning: collection.update is deprecated. Use updateOne, updateMany, or bulkWrite instead.
 (node:1) DeprecationWarning: collection.ensureIndex is deprecated. Use createIndexes instead.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.
(node:1) DeprecationWarning: collection.find option [fields] is deprecated and will be removed in a later version.

๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค package-lock.json์„ ์‚ฌ๋ž‘ํ•ฉ๋‹ˆ๋‹ค...

์ด๋Ÿฌํ•œ ์ง€์› ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

1) ์žฌ: findOneAndUpdate() ๋ฐ findAndModify() ์ง€์› ์ค‘๋‹จ, mongoose.set('useFindAndModify', false); ์‚ฌ์šฉ
2) Re: remove() ์ง€์› ์ค‘๋‹จ, ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋งŒ ์‚ญ์ œํ•  ๊ฒƒ์ธ์ง€์— ๋”ฐ๋ผ deleteOne() ๋˜๋Š” deleteMany() ์‚ฌ์šฉ์œผ๋กœ ์ „ํ™˜
3) ์žฌ: update() ์ง€์› ์ค‘๋‹จ, updateMany() ๋กœ ๋Œ€์ฒด

์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์„œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  mongoose๊ฐ€ ์ด๋Ÿฌํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ  ์ค‘ ํ•˜๋‚˜๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๋„๋ก ๋‚ด๋ถ€ ๋ณ€๊ฒฝ์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค์—์„œ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋ฉ”์„œ๋“œ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  useFindAndModify ์˜ต์…˜์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด๊ฒƒ์„ ์ฐฌ์„ฑํ•  ๊ฒƒ์ด๋‹ค ๐Ÿ‘

mongoose๋Š” ์ด๋ฏธ deleteOne() , deleteMany() , updateMany() ๋“ฑ์˜ ์ƒˆ๋กœ์šด ๋ฉ”์†Œ๋“œ๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ?

+1
๊ฐ™์€ ๊ฒฝ๊ณ . ์ƒˆ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ธฐ๋‹ค๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ง€๊ธˆ ๋‹น์žฅ ์šฐ๋ฆฌ๋Š” ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋‚ด ๋ง์€ API๋ฅผ ๋งŒ๋“ค๋ ค๊ณ ํ•˜๋Š”๋ฐ db์—์„œ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ€์ ธ์™€์•ผํ•˜๊ณ  collection.find().then()....etc๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋™์ผํ•œ ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ทธ find() ๋ฉ”์†Œ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ฒฝ๊ณ ๊ฐ€ ๊ท€์ฐฎ๋‹ค๋ฉด Node์—์„œ ์ง€์› ์ค‘๋‹จ ์•Œ๋ฆผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜(์œ„์˜ Fonger ์ฃผ์„ ์ฐธ์กฐ) Mongoose์˜ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฐพ๊ธฐ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค mongoose์—์„œ ์ด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๋ชฝ๊ตฌ์Šค ํŒ€์—์„œ ๋‹ค์Œ ์—…๋ฐ์ดํŠธ๊นŒ์ง€ ๋ฌด์‹œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(node:15500) DeprecationWarning: collection.find ์˜ต์…˜ [fields]๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ ์ดํ›„ ๋ฒ„์ „์—์„œ ์ œ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

fields ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์€ 5.2.10์— ์žˆ์œผ๋ฉฐ ๋” ์ด์ƒ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋ฅผ ์ •๋ฆฌํ•˜๋ ค๋ฉด ์ด ์ฃผ์„์˜ ์ง€์นจ์„ ๋”ฐ๋ฅด์„ธ์š”. https://github.com/Automattic/mongoose/issues/6922#issue -354147871

์ด ๋ฌธ์„œ๋ฅผ ์ž‘์„ฑํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค https://mongoosejs.com/docs/deprecations.html

๋‹ค์‹œ: findOneAndUpdate() ๋ฐ findAndModify() ์‚ฌ์šฉ ์ค‘๋‹จ, ํ˜„์žฌ( 5.2.17 ) ์œ ์ผํ•œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

mongoose.set('useFindAndModify', false);

๊ทธ๊ฒŒ ์‚ฌ์‹ค์ด์•ผ?

Model.findByIdAndUpdate() ๋ฐ Model.findOneAndUpdate() ๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

mongoose์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ mongo db ๋“œ๋ผ์ด๋ฒ„ ๊ธฐ๋Šฅ์€ ์–ด๋Š ์‹œ์ ์—์„œ ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋งž์„๊นŒ?

+1 Model.findByIdAndUpdate() ์‚ฌ์šฉ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋ชฝ๊ณ DB: 3.1.4
  • ๋ชฝ๊ตฌ์Šค: 5.2.16

์ด๊ฒƒ์— ๋Œ€ํ•œ ์†Œ์‹์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@gianpaj yes mongoose.set('useFindAndModify', false) ๋Š” findAndModify ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ ์— collection.findAndModify() ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ˜ธ์ถœ์€ [email protected]์—์„œ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @vkarpov15 ๊ทธ ๋ง์ด ๋งž๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์„ ์•ฝ์†ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ด๋ฅด๋‚˜์š”?

@daniyalawan ์—ฌ๊ธฐ์—์„œ ๋ฌธ์„œ๋ฅผ ํ™•์ธ ํ•˜์„ธ์š”. ์ฝ”๋“œ์—์„œ findOneAndUpdate ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 'useFindAndModify' ์˜ต์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(๋‚ด๋ถ€์ ์œผ๋กœ findOneAndUpdate๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— findByIdAndUpdate๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค).

@Sastidar [email protected]๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š” ์ด ๋ฌธ์„œ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@lineus @gianpaj ๋„ค, useFindAndModify ์˜ต์…˜์— ๋Œ€ํ•œ ํ•„์š”์„ฑ์€ Mongoose 6.0.0๊ณผ ํ•จ๊ป˜ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Mongoose 6์„ ์ถœ์‹œํ•  ์ผ์ •์€ ์—†์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ์™€ ๊ด€๋ จํ•˜์—ฌ - mongoose๊ฐ€ findByIdAndUpdate ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹จ๊ณ„์ ์œผ๋กœ ์ค‘๋‹จํ•  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๊ธฐ๋ณธ findAndModify ๊ฐ€ ๋‚ด ๊ตฌํ˜„์„ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๋‹จ๊ณ„์ ์œผ๋กœ ์ œ๊ฑฐ๋  ์˜ˆ์ •์ž…๋‹ˆ๊นŒ?

๊ธฐ๋ณธ์ ์œผ๋กœ ๋” ํฐ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๊ฐ–๊ธฐ ์ „์— findByIdAndUpdate ๋ฅผ ๋ชจ๋‘ findOneAndUpdate ๋กœ ๋ณ€๊ฒฝํ•˜๋Š”์ง€ ๋ฌป๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

@gianpaj yes mongoose.set('useFindAndModify', false) ๋Š” findAndModify ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์œ ์ผํ•œ ํ˜„์žฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ ์— collection.findAndModify() ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ํ˜ธ์ถœ์€ [email protected]์—์„œ ์‚ฌ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. @vkarpov15 ๊ทธ ๋ง์ด ๋งž๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์‹œ๊ฐ„ ํ”„๋ ˆ์ž„์„ ์•ฝ์†ํ•˜๊ธฐ์—๋Š” ๋„ˆ๋ฌด ์ด๋ฅด๋‚˜์š”?

@daniyalawan ์—ฌ๊ธฐ์—์„œ ๋ฌธ์„œ๋ฅผ ํ™•์ธ ํ•˜์„ธ์š”. ์ฝ”๋“œ์—์„œ findOneAndUpdate ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด 'useFindAndModify' ์˜ต์…˜์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค(๋‚ด๋ถ€์ ์œผ๋กœ findOneAndUpdate๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์— findByIdAndUpdate๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค).

@Sastidar [email protected]๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•œ ํ›„ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ชจ๋“  ์‚ฌ์šฉ ์ค‘๋‹จ ๊ฒฝ๊ณ ๋Š” ์ด ๋ฌธ์„œ์—์„œ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

$#$ mongoose.set('useFindAndModify', false) ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด {new: true} ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@ anks333 ๋‹ค์Œ ์˜ˆ๊ฐ€ ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค. { new: true } ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ํ‘œ์‹œํ•˜๋„๋ก ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

6880.js

#!/usr/bin/env node
'use strict';

const assert = require('assert');
const mongoose = require('mongoose');
mongoose.set('useFindAndModify', false);
const { Schema, connection} = mongoose;
const DB = '6880';
const URI = `mongodb://localhost:27017/${DB}`;
const OPTS = { family: 4, useNewUrlParser: true };

const schema = new Schema({
  name: String
});

const Test = mongoose.model('test', schema);

const test = new Test({ name: 'test1' });

async function run() {
  await mongoose.connect(URI, OPTS);
  await connection.dropDatabase();
  const doc = await Test.create(test);
  assert.ok(doc);
  const cond = {};
  const update = { name: 'test2' };
  const options = { new: true };
  const updated = await Test.findOneAndUpdate(cond, update, options);
  assert.strictEqual(updated.name, 'test2');
  console.log('All Assertions Pass.');
  await connection.close();
}

run();

์‚ฐ์ถœ:

issues: ./6880.js
All Assertions Pass.
issues:

@LBWright ์šฐ๋ฆฌ๋Š” findByIdAndUpdate์— ๋Œ€ํ•œ ์ง€์›์„ ์ค‘๋‹จํ•  ์ƒ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค. API๋ฅผ ์ค‘๋‹จํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋ณธ findAndModify๋งŒ ๊ต์ฒดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(node:10767) DeprecationWarning: collection.ensureIndex๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  createIndexes๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰