我有一个事件对象,它是通过Mongoose插件从MongoDB中获取的。在这个对象中完成了一些操作,最后我想将这个对象保存在另一个具有相同结构的集合中。
为此,我需要从' _'中删除所有属性。或者' __'喜欢' _id'和' __ v'。我编写的代码如下:
console.log(event);
console.log(delete event._id);
console.log(event);
第1行和第3行使用_id属性打印相同的值。如果我删除其他一些属性,例如' code',同样的工作正常。这是完整的事件对象:
{ _id: 5a51019b211d740a174a1fba,
__t: 'EventModel',
code: '02',
event: 'testMe',
source: 'user',
target: 'cronjob',
__v: 0,
params:
[ { key: 'Nodics',
value: 'Framework',
_id: 5a51019b211d740a174a1fbb } ],
log: [ 'Published Successfully' ],
hits: 1,
type: 'ASYNC',
state: 'FINISHED',
testProperty: 'Nodics Framework',
updatedDate: 2018-01-13T17:04:15.288Z,
creationDate: 2018-01-13T17:04:15.288Z
}
请帮助我了解根本原因以及我如何处理这个问题。对我来说,它看起来直接或继承属性问题。但需要专家评论。
答案 0 :(得分:5)
看起来你无法删除其中一些属性的原因是它们被定义为“non-configurable”。但是,您的方法是次优的,因为它必然会改变其参数。 永远不要改变一个论点。如初。强>
您应该构建一个仅包含所需属性的新对象,而不是从event
中删除属性。
Object.getOwnPropertyNames
像lodash这样的图书馆有糖做这种事情:
// whitelist (using lodash)
var saveableEvent = _.pick(event, ['code', 'event', 'source', 'target', 'params', 'log', 'hits', 'type', 'state', 'testProperty', 'updatedDate', 'creationDate']);
// or blacklist (using lodash)
var saveableEvent = _.omit(event, ['_id', '__t', '__v']);
// only copy object's own properties (without lodash)
var saveableEvent = Object.getOwnPropertyNames(event)
.reduce(function(out, propName) {
return Object.assign(out, event[propName])
}, {})
// create editable copy of object, then remove undesired props
var saveableEvent = event.toObject();
delete saveableEvent._id;
答案 1 :(得分:3)
您在查询时尝试过lean()吗? 喜欢find(query).lean()...检查这个http://blog.sandromartis.com/2016/05/08/mongoose-lean/ 这将允许您对对象执行任何操作。
其他方式可能是扩展根对象,并从中删除不需要的属性。你可以使用https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
示例:
var obj = { a: 1 };
var copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
delete copy._id;//or whatever you want
console.lg(copy);//check this doesnt have the _id;
由于 希望这有帮助
答案 2 :(得分:0)
古老的问题,但我把2美分扔进了争执。...
我遇到了这个问题,并使用Object.entries()
+ Array.reduce()
来解决。这是我的看法:
// define dis-allowed keys and values
const disAllowedKeys = ['_id','__v','password'];
const disAllowedValues = [null, undefined, ''];
// our object, maybe a Mongoose model, or some API response
const someObject = {
_id: 132456789,
password: '$1$O3JMY.Tw$AdLnLjQ/5jXF9.MTp3gHv/',
name: 'John Edward',
age: 29,
favoriteFood: null
};
// use reduce to create a new object with everything EXCEPT our dis-allowed keys and values!
const withOnlyGoodValues = Object.entries(someObject).reduce((ourNewObject, pair) => {
const key = pair[0];
const value = pair[1];
if (
disAllowedKeys.includes(key) === false &&
disAllowedValues.includes(value) === false
){
ourNewObject[key] = value;
}
return ourNewObject;
}, {});
// what we get back...
// {
// name: 'John Edward',
// age: 29
// }
// do something with the new object!
server.sendToClient(withOnlyGoodValues);
一旦您了解了它的工作原理,就可以对其进行更多的清理,尤其是使用一些精美的ES6语法时。为了演示起见,我特意尝试使其更具可读性。
阅读有关Object.entries()
工作原理的文档:MDN - Object.entries()
阅读有关Array.reduce()
工作原理的文档:MDN - Array.reduce()
答案 3 :(得分:0)
我最近有一个类似的问题。我使用loadash切断了数组中不需要的值,但是必须在获取的对象中使用.toObject()
以便可以将其用作参数。像这样:
let resultExample = _.omit(exampleObject.toObject(), ['x', 'y', 'z']);
答案 4 :(得分:0)
在玩mongo对象的属性时,我发现了一种删除那些不必要属性的简单方法。
delete event._doc._id;
delete event._doc.__v;
答案 5 :(得分:-1)
use something like this
var event= event.toObject();
delete event._id;
答案 6 :(得分:-2)
感谢您的快速帮助。您首先解决方案是有效的,但只有问题,属性是硬编码的,尽管我们可以使其可配置。 我试过的第二个解决方案,但无法产生任何影响。第三个是好的,但复制了很多属性,我们真的不需要。
除了这些之外,我尝试了以下解决方案并且现在可以使用,虽然它的性能代价很高但是它很好,直到我没有得到一个正确的:
let savableEvent = JSON.parse(JSON.stringify(event));
delete savableEvent._id;
delete savableEvent.__v;
delete savableEvent.__t;
如果我得到更好的东西,我会发布。