๋ฌธ์์ _id
๊ฐ toObject() ์ดํ์ ์ฌ์ ํ ObjectId์์ ์์์ต๋๋ค.
์ด๊ฒ์ ๋ฌ์ฑํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๊น?
๊ฐ์ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. toJSON()
๋ฐ toObject()
๋ชจ๋ ObjectId
์ธ์คํด์ค๋ฅผ ๋ฌธ์์ดํํ์ง ์์ต๋๋ค.
ObjectIds๋ ๊ธฐ์ ์ ์ผ๋ก ๋ฌธ์์ด์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํ์ฌ ์๋์ ์ผ๋ก ์ค๊ณ๋ ๊ฒ์
๋๋ค. ๋ด ๋จธ๋ฆฌ ๊ผญ๋๊ธฐ์์ ๋ด๊ฐ ์๊ฐํ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ JSON.parse(JSON.stringify(doc));
์
๋๋ค. ๋ชจ๋ ๊ฐ์ฒด ID๋ฅผ ๋ฌธ์์ดํํ๋ ์ฌ์ฉ ์ฌ๋ก๋ ๋ฌด์์
๋๊น?
๊ทธ๋์ toJSON()
ํจ์๋ ๊ฐ์ฒด๋ฅผ JSON ๋ฌธ์์ด๋ก ๋ณํํ์ง ์์ต๋๊น? _id ๋ฐ date๋ ๋ฌธ์์ด์ด ์๋๋ผ ๊ฐ์ฒด์
๋๊น?
๊ทธ๋ฐ๋ฐ toObject()
์ toJSON()
์ ์ฐจ์ด์ ์ ๋ฌด์์
๋๊น?
๊ณ ๋ง์!
์ ๋ ์ง๋ toJSON()
+ toObject()
์ดํ์ ๋ฌธ์์ด์ด ์๋๋ผ ๋ ์ง์ฌ์ผ ํฉ๋๋ค.
toJSON()
๋ฐ toObject()
๋ ๋ณธ์ง์ ์ผ๋ก ๋์ผํ์ง๋ง JSON.stringify(doc)
๋ฅผ ์ํํ ๋ JavaScript๋ ๋ฌธ์์์ toJSON()
ํจ์๋ฅผ ์ฐพ๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌผ์ฒด. ๋ฐ๋ผ์ toJSON()
JSON.stringify()
์ ๋ํ ๊ตฌ๋ฌธ ์คํ์
๋๋ค.
@vkarpov15 ๋ง๊ฐ๋ ์ด์์ ๋๊ธ์ ๋ฌ์์ ์ฃ์กํฉ๋๋ค๋ง, ์ด ์ด์์ ์ง์ ์ ์ธ ๊ด๋ จ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ํ๊ธฐ์ ๊ฐ์ฅ ์ ์ ํ ์ฅ์์ธ ๊ฒ ๊ฐ์ต๋๋ค.
๋ ๊ฐ์ ๋ชฝ๊ตฌ์ค ๋ฌธ์๋ฅผ ์ฌ์ธต ๋น๊ตํ์ฌ ๋ ๋ฌธ์ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํ diff ๊ฐ์ฒด๋ฅผ ์ป์ผ๋ ค๊ณ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ObjectID๋ ์ ํํ ๋์ผํ ID๋ฅผ ํฌํจํ๋๋ผ๋ ํญ์ diff๋ก ๋๋๊ธฐ ๋๋ฌธ์ ์ง์ ๋น๊ตํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง ๋ด๊ฐ ํ ์ ์์๋ ์ ์ผํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
var objectdiff = require('object-deep-diff');
var diffresult = objectdiff(
JSON.parse(JSON.stringify(doc1.toObject())),
JSON.parse(JSON.stringify(doc2.toObject()))
);
๊ทธ๊ฒ์ ๊ฐ์ฒด ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์ป๋ ๋น์ผ ๋ฐฉ๋ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
mongoose ๋ฌธ์๋ฅผ ์์ ์ ์ผ๋ก ๋น๊ตํ๋ ๋ ์ข์ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
์ผ๋ง๋ ๊น์ diff๊ฐ ์๋ํ๋์ง ํ์คํ์ง ์์ง๋ง mongodb ObjectIds์ ๋ช ๊ฐ์ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. _id ๋ฐ ๊ธฐํ objectid ํ๋๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํด ๋ณด์ญ์์ค. ๋๋ lodash์ ๊น์ ๋๋ฑ์ฑ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ObjectIds์ ํจ๊ป ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@vkarpov15 deep diff๋ ํ๋ฑ ํ์ธ์ ์ํด lodash๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ถํํ๋ ์๋ํ์ง ์์ต๋๋ค.
https://github.com/rbs392/object-deep-diff/blob/master/index.js
๋ชจ๋ ObjectId๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ฉด ํจ๊ณผ๊ฐ ์์ง๋ง ๊ฐ์ฒด์ ๋ฐฐ์ด ๋ฐ/๋๋ ๊ธฐํ ์ค์ฒฉ ๊ฐ์ฒด๊ฐ ํฌํจ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ํํ๋ ๋ฐ์๋ ์๋นํ ๋น์ฉ์ด ์์๋ฉ๋๋ค. :/
์ฌ๊ธฐ ๋ ๋ค๋ฅธ ์ง๋ฌธ์ด ์์ต๋๋ค toObject()
์ ๊ฒฐ๊ณผ์ธ 2๊ฐ์ mongoose ๋ฌธ์ ๋๋ 2๊ฐ์ ๋ฌธ์์์ deep-diff๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๊น? ํ์๋ ํจ๊ณผ๊ฐ ์์ด์ผ ํ์ง๋ง ์ ์๋ ๊ทธ๋ค์ง ํจ๊ณผ๊ฐ ์์ต๋๋ค.
@vkarpov15 ์ผ๋ฐ์ ์ผ๋ก 1๊ฐ์ ๋ชฝ๊ตฌ์ค ๋ฌธ์(.toObject๊ฐ ์๋ javscript ๊ฐ์ฒด๋ก ๋ณํ๋จ)์ ํ๋์ ์ผ๋ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์
๋๋ค.
๊ทธ ์ด์ ๋ ํด๋ผ์ด์ธํธ์์ ์ค๋ ๋ฐ์ดํฐ์ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ฐ๋ผ์ ํด๋ผ์ด์ธํธ์์ ์ค๋ ๋ฐ์ดํฐ์๋ ์ด๋ฏธ ObjectID๊ฐ ๋ณํ๋์ด ์์ง๋ง ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ค๋ ๋ฐ์ดํฐ๋ ๋ณํ๋์ง ์์์ต๋๋ค.
ํ์ง๋ง mongoose ํ๋ฌ๊ทธ์ธ์์ ์ด deep-diff ๊ฒ์ฌ๋ฅผ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ ๋ฌธ์๊ฐ ๋์ผํ๊ฒ ๊ตฌ์ฑ๋์๋์ง ์ ๋์ ์ผ๋ก ํ์ธํด์ผ ํ๋ฏ๋ก JSON.parse(JSON.stringify(doc.toObject())๋ฅผ ์คํํด์ผ ํฉ๋๋ค. ) ๋ ๋ฌธ์ ๋ชจ๋์์.
์, ์ด ๊ฒฝ์ฐ JSON.parse(JSON.stringify())
๋ฅผ ์ํํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ ๊ฐ์ฒด ID๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์
๋๋ค.
JSON.parse(JSON.stringify())
๋ ๋์๊ฒ ๋๋ฌด ๊ณ์ฐ ์ง์ฝ์ ์ด์ด์ ์ด ์ฑ๋ฅ์ ๊ณ ๋ คํ lib๋ฅผ ๋ง๋ค์ด์ผ ํ์ต๋๋ค .
var transformProps = require('transform-props');
function castToString(arg) {
return String(arg);
}
var doc = new MongooseModel({ subDoc: { foo: 'bar' }});
var docObj = doc.toObject();
transformProps(docObj, castToString, '_id');
console.log(typeof docObj._id); // 'string'
console.log(typeof docObj.subDoc._id); // 'string'
๋ชฝ๊ณ ์ ์ด ๊ธฐ๋ฅ์ ์ ๋ง ์์ฝ๋ค
@ZacharyRSmith ๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ ์ํ์ ์ด๋ป์ต๋๊น? author_id(ObjectId๋ ์ฌ์ฉ์ ๋ชจ๋ธ์ ๋ํ๋)/author_ids(ObjectId์ ๋ฐฐ์ด)?
@flight9 ์ฌ๋ฌ ํค๋ฅผ ์ฐพ๋๋ก transformProps()์ ์ง์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ์ด ํ ์คํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค: https://github.com/ZacharyRSmith/transform-props/blob/master/index.test.js#L67
๋๋ ๋น์ ์ด ์ด๊ฒ์ผ๋ก ๋น์ ์ด ์ํ๋ ๊ฒ์ ์ป์ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
function myToString(val) {
if (Array.isArray(val)) {
return val.map(item => String(item));
}
return String(val);
}
transformProps(obj, myToString, ['author_id', 'author_ids']);
@ZacharyRSmith ์๋ฃจ์ ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ํ๋ฅญํฉ๋๋ค!
ํ ๊ฐ์ง ์ค์ํ ์ฌ์ค์ ๋์น ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ค ํ๋๊ฐ ObjectId์ธ์ง ๋ฏธ๋ฆฌ ์์ง ๋ชปํฉ๋๋ค. ์๋ํ๋ฉด ์ ๊ฐ ์์ฑํ๊ณ ์๋ ๋๊ตฌ๋ ์ฌ๋ฌ ObjectId ํ๋๊ฐ ์๊ฑฐ๋ ์์ ์ ์๋ ํ๋ก์ ํธ์ ๋ชจ๋ ๋ชจ๋ธ์ ์ ์ฉ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ถํ์คํ๋ค.
๋ฐ๋ผ์ ๋ช ์๊ฐ ๋์ ์๋ํ ํ์ ๋ด ์๋ฃจ์
์ด ์์ต๋๋ค.
const ObjectID = require('mongodb').ObjectID;
/**
* Convert ObjectId field values inside an object to String type values
* (includes array of ObjectIds and nested ObjectId fields)
* <strong i="9">@param</strong> obj Object - The Object to be converted.
* <strong i="10">@return</strong> none
*/
function objectIdtoString(obj) {
for(let k in obj) {
let v = obj[k];
if(typeof v == 'object') {
if(k.endsWith('_id') && v instanceof ObjectID) {
obj[k] = v.toString();
}
else if(
k.endsWith('_ids') && Array.isArray(v) &&
v.length > 0 && v[0] instanceof ObjectID
) {
let vs = [];
for(let iv of v) {
vs.push(iv.toString());
}
obj[k] = vs;
}
else {
objectIdtoString(v);
}
}
}
}
// Call example
objectIdtoString(obj):
@vkarpov15
์, ์ด ๊ฒฝ์ฐ JSON.parse(JSON.stringify())๋ฅผ ์ํํด์ผ ํฉ๋๋ค. ์ด๊ฒ์ด ๋ชจ๋ ๊ฐ์ฒด ID๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
tldr; JSON.parse(JSON.stringify())
๋ ๋๊ธฐ์ ์ฐจ๋จ ์์
์ด๋ฉฐ ์ฌ๊ฐํ ๋ณ๋ชฉ ํ์์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ด ๋ฌธ์ ์ ๋ํด ํ์ฉ/์ ์๋ ์๋ฃจ์
์ด ์๋์ด์ผ ํฉ๋๋ค...
mongoose.Types.ObjectId.prototype.toJSON = function() { return this.toString();
๋ ํ ์ ์์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๊ธฐ์ฌ์์๋ JSON.parse(JSON.stringify)๋ ๋ฅ ํด๋ก ์ ์ํํ๋ ๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ ์ค ํ๋๋ผ๊ณ ๋งํฉ๋๋ค. ๋ฌธ์ ๋ ๋ถํ์ํ๊ฒ ๋ฅ ํด๋ก ์ ๋ฐ๋ณต์ ์ผ๋ก ์ํํ๋ค๋ ๊ฒ์ด์์ต๋๋ค.
์, ์ฌ๊ธฐ 2019๋
์ด ์์ต๋๋ค.
๊ฐ์ฒด์ ๋ชจ๋ ObjectId ์ธ์คํด์ค์์ 16์ง์ ๋ฌธ์์ด์ ๊ฐ์ ธ์ค๋ ๋ฉ์ง๊ณ ๊นจ๋ํ๊ณ ๋ถ๋ช
ํ ๋ฐฉ๋ฒ์ด ์์ง ์์ต๋๊น?
@gitowiec
mongoose.ObjectId.get(v => v.toString());
์ฐธ์กฐ: http://thecodebarbarian.com/whats-new-in-mongoose-54-global-schematype-configuration.html#schematype -getters
@vkarpov15 ๋ '๋ฆฐ'์ ์ฌ์ฉํ ๋ ์ด๊ฒ์ด ์๋ฃจ์
์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
๋ฐ๋ผ์ ์ํ๋ ๊ฒฐ๊ณผ๊ฐ string objectIds๊ฐ ์๋ ์ผ๋ฐ json ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ผ๋ฉด ์ด๋ฅผ ๋ฌ์ฑํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ lean
์ต์
๊ณผ ํจ๊ป JSON.parse(JSON.stringify())
๋ฅผ ๊ณ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
๋๋ ๊ฐ๋ฅํ ๋ฆฐ ํ๋ฌ๊ทธ์ธ: https://www.npmjs.com/package/mongoose-lean-objectid-string
@nhitchins ๋ง์ต๋๋ค. mongoose-lean-getters ์ ๊ฐ์ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
@ vkarpov15 ์ด๊ฒ์ ๋ํ ํ๋ณ์ ์คํค๋ง์ ํจ๊ป ์๋ํด์ผ ํฉ๋๊น? ๋ณํ์ ๋ง๋๋ ๊ธฐ๋ณธ ์คํค๋ง๊ฐ ์์ต๋๋ค. ๊ธฐ๋ณธ ์คํค๋ง์์ getter๋ฅผ ์ค์ ํ๋ ค๊ณ ํ์ต๋๋ค. ๋๋ lean()์ ์ฌ์ฉํ๊ณ mongoose-lean-getters๋ฅผ ์ฌ์ฉํ์ง๋ง ์ด๊ฒ์ด ์๋ํ๋๋ก ํ ์ ์์์ต๋๋ค.
@pwrnrd ์ ๋ฌธ์ ๋ฅผ ์ด๊ณ ๋ฌธ์ ํ ํ๋ฆฟ์ ๋ฐ๋ฅผ ์ ์์ต๋๊น? ํ๋ณ์ ์คํค๋ง์ ์ ์๋ํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ชฝ๊ณ ์ ์ด ๊ธฐ๋ฅ์ ์ ๋ง ์์ฝ๋ค