-
Notifications
You must be signed in to change notification settings - Fork 11
Mongoose document udpate ๋ฐฉ์
Account ์ปฌ๋ ์ ์ transaction ๋ํ๋จผํธ์ objectId๋ฅผ ์์ ์ ํ๋์ธ transactions์ ์ถ๊ฐํ์ฌ์ผ ํ๋ค.
๊ทธ ๊ณผ์ ์ ๋ค์ ๋ ๊ฐ์ง ์ผ์ ํด์ผ ํ๋ค.
-
Account Object Id๋ก Account ๋ํ๋จผํธ๋ฅผ ์ฐพ๋๋ค.
-
๊ทธ ๋ํ๋จผํธ์ trasactions์ ์๋กญ๊ฒ ๋ง๋ transaction ๋ํ๋จผํธ์ Object Id๋ฅผ ์ถ๊ฐํ๋ค.
๊ณต๋๊ฐ๊ณ๋ถ๋ฅผ ๊ด๋ฆฌํ๊ฒ ๋๋ค๋ฉด, ๋์์ ์ฌ๋ฌ ์ฌ๋์ด ๊ฑฐ๋๋ด์ญ์ ์ถ๊ฐ, ์ญ์ ๋ฑ์ ์์ฒญ์ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก, ์ฐ๋ฆฌ๋ ๋ชจ๋ ๋๋น์ ๋ํ ์ ๊ทผ ์์ฒญ์ด ์ ํจํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ ๊ณ ๋ คํด์ผ ํ๋ค.
๋ชฝ๊ตฌ์ค์์ Atomic Update
๋ฅผ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ์ฐพ์๋ณด์.
์ฐ์ update๋ฅผ ํ๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ๋ค์ ์ฐพ์๋ณด์๋ค.
-
in-memory update
const targetAccount = await this.findById(accountObjId).exec(); targetAccount.transactions.push(transactionObjId); await targetAccount.save();
find๋ฅผ ํด์ ๊ฐ์ ธ์จ ๋ํ๋จผํธ๋ฅผ updateํ ํ saveํ๋ ๋ฐฉ์์ด๋ค. ์ด ๋ฐฉ์์ ๋ํ๋จผํธ๋ฅผ ๊ฐ์ ธ์จ ํ, save๊ฐ ๋๊ธฐ ์ ์ ๋ค๋ฅธ ์ฟผ๋ฆฌ์ ์ํด ๋ํ๋จผํธ๊ฐ ๋ณ๊ฒฝ๋ ์ ์๋ค.
-
findOneAndUpdate()
User.findByIdAndUpdate(id, { $push: { createdEvents: eventId } }).exec();
๋ชฝ๊ตฌ์ค ๊ณต์๋ฌธ์์ ๋ฐ๋ฅด๋ฉด findOndAndUpdate๋ atomicํ๋ค๊ณ ํ๋ค.
With the exception of an unindexed upsert, findOneAndUpdate() is atomic.
$push operator๋ ๋ฐฐ์ด์ ๊ฐ์ ์ถ๊ฐํ๋ค. ์ด ๋ฐฉ์์ผ๋ก id์ ํด๋นํ๋ ๋ํ๋จผํธ๋ฅผ ์ฐพ์์ createdEvents ๋ฐฐ์ด์ eventId๋ฅผ ์ถ๊ฐํ ์ ์๊ฒ ๋๋ค.
- Update
update๋ ๋ง์ฐฌ๊ฐ์ง๋ก atomicํ๋ค. ์ฒซ ๋ฒ์งธ ์ธ์๋ก ํํฐ๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ๋ ๋ฒ์งธ ์ธ์๋ก ์คํํ ๋ํ๋จผํธ๋ฅผ ์ ๋ ฅํด์ฃผ๋ฉด ๋๋ค. findOneAndUpdate์ ๋ค๋ฅธ ์ ์ findOneAndUpdate๋ ๋ํ๋จผํธ๋ฅผ ๋ฆฌํดํด์ฃผ์ง๋ง, update๋ ๋ํ๋จผํธ๋ฅผ ๋ฆฌํดํ์ง ์๋๋ค.
PersonModel.update(
{ _id: person._id },
{ $push: { friends: friend } },
done
);
this.findByIdAndUpdate(accountObjId, {
$push: { transactions: transactionObjId },
}).exec();
findOneAndUpdate๋ atomicํ๋ค๊ณ ํ๋ค. ์ฐ๋ฆฌ๋ Account ์ปฌ๋ ์
์์ Object Id๋ฅผ ์ฐพ์์ update๋ฅผ ํด์ค์ผํ๋ฏ๋ก, findByIdAndUpdate
๊ฐ ์ ํฉํ๋ค๊ณ ์๊ฐํ์๋ค. findByIdAndUpdate ๋ ๋ด๋ถ์ ์ผ๋ก findOneAndUpdate๋ฅผ ๋ถ๋ฌ์ค๋ค๊ณ ํ๋, findByIdAndUpdate ๋ํ atomic ํ ๊ฒ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
- exec
update๋ง ํ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ์ค ์์๋๋ฐ, ๊ณต์๋ฌธ์์ ์์ ๋ฅผ ๋ณด๋ฉด, exec()
๋ฅผ ๋ง์ง๋ง์ ๋ถ๋ฌ์ค๋๊ฒ ์์๋ค. exec๋ฅผ ์ ํด์ฃผ๋ ๊ฑธ๊น???
๊ทธ๋ฅ query๋ฌธ์ ํธ์ถํ๋ฉด, ์ค์ ์ ์ผ๋ก ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๋ค.
์ฝ๋ฐฑ ํจ์์ ์ ๋ฌด
์ ๋ฐ๋ผ ์คํ์ด ๋ฌ๋ผ์ง๊ฒ ๋๋ค.
์ฝ๋ฐฑ ํจ์๊ฐ ์์ผ๋ฉด ์คํ์ด ๋๊ณ , ์ฝ๋ฐฑ ํจ์๊ฐ ์์ผ๋ฉด ์ฟผ๋ฆฌ๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ค.
A.findByIdAndUpdate(id, update, options, callback) // executes
A.findByIdAndUpdate(id, update, callback) // executes
A.findByIdAndUpdate(id, update, options) // returns Query
A.findByIdAndUpdate(id, update) // returns Query
A.findByIdAndUpdate() // returns Query
๋ฐ๋ผ์, ์ฝ๋ฐฑ ํจ์ ์์ด ๋ฐ๋ก ์ฟผ๋ฆฌ๋ฅผ ์คํ์ํค๋ ค๋ฉด, update() ํธ์ถ ํ exec()๋ฅผ ํธ์ถํด์ผ ํ๋ค.
const q = Model.where({ _id: id });
q.update({ $set: { name: 'bob' }}).update(); // not executed
q.update({ $set: { name: 'bob' }}).exec(); // executed
- upsert option
upsert๋ฅผ true๋ก ์ฃผ๋ฉด, document๊ฐ ์์ผ๋ฉด update๋ฅผ ํ๊ณ , ์์ผ๋ฉด, filter์ update๋ฅผ ๊ฒฐํฉํ์ฌ ์์ฑํ๋ค.
const filter = { name: 'Will Riker' };
const update = { age: 29 };
await Character.countDocuments(filter); // 0
let doc = await Character.findOneAndUpdate(filter, update, {
new: true,
upsert: true // Make this update into an upsert
});
doc.name; // Will Riker
doc.age; // 29
Push items into mongo array via mongoose
https://ddcode.net/2019/05/12/is-mongodb-findoneandupdate-thread-safe/
- API ์์
- API ์ค๊ณ
- DB ๋ชจ๋ธ๋ง
- ๊ธฐ์ ์ ์ ์ด์
- Feature list
- ํ๋ฉด ๋ช ์ธ์
- ํ๋ก์ ํธ ๊ตฌ๋ ๋ฐฉ๋ฒ
- ๊ธฐ์ ํน์ฅ์
- ์ฃผ์ ๊ธฐ๋ฅ ์๊ฐ
- Optimistic Update
- ์ํ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊น
- Atomic Design ์ค๊ณ
- Mongoose Atomic Update ๋ฐฉ์์ ์ฐพ์์
- MobX Best Practices๋ ์ด๋์
- ๊ฑฐ๋๋ด์ญ ์คํ ์ด ๊ด๋ฆฌ
- user-account DB๊ด๊ณ ์์
- ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํ
1 ์ฃผ์ฐจ
- ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ
- ํ๊ณ
2 ์ฃผ์ฐจ
- ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ
- ํ๊ณ
3 ์ฃผ์ฐจ
- ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ
- ํ๊ณ
4 ์ฃผ์ฐจ
5 ์ฃผ์ฐจ
- ๋ฐ์ผ๋ฆฌ์คํฌ๋ผ
- ํ๊ณ