猫鼬-从SubDocument删除属性

时间:2018-12-29 19:46:52

标签: javascript node.js mongodb mongoose subdocument

我有以下Mongoose模式和代码:

模式:

{
    ...
    inv: {
        type: Object,
        default: {}
    },
    ...
}

代码(版本1),其中targetData是猫鼬DocumentitemString,而amountNumber

targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) delete targetData.inv[item];
await targetData.save();

代码(版本2):

targetData.inv[item] = targetData.inv[item] - amount;
if (!targetData.inv[item]) targetData.inv[item] = undefined;
await targetData.save();

问题在于这些尝试均未从文档中删除targetData.inv[item]。我的目标是从子文档中删除一个项目,例如"thing"。例如:

之前:

{
    ...
    inv: {
        thing: 5
    },
    ...
}

之后:

{
    ...
    inv: {},
    ...
}

注意:当amount小于5(在上面的示例中)时,代码可以正常工作。如果我要删除所有的5,那时候它不会更新,它将保持为5

注意2:我使用的是Mongoose 5.3.15

我该如何实现?

编辑:看起来只有inv只有1个属性时才会发生。拥有inv: { thing: 5, anotherThing: 6 }之类的东西可以与delete关键字完美搭配。

2 个答案:

答案 0 :(得分:1)

找出问题所在。我需要做的就是手动告诉Mongoose使用targetData.markModified("inv")修改了library(pheatmap) library(dplyr) data = data.frame(matrix(runif(10*10), ncol=10)) data$sample = rep(c("tumour", "normal"), 5) data$subject.ID = paste('Subject', 1:10) data = data %>% arrange(sample) # for row annotation my_sample_col = data %>% select(sample) rownames(my_sample_col) = data$subject.ID # data matrix mat = as.matrix(data %>% select(-sample, -subject.ID)) rownames(mat) = data$subject.ID pheatmap(mat, scale='row', annotation_row = my_sample_col, annotation_names_row=F, cluster_rows = FALSE, cluster_cols = FALSE, show_colnames = FALSE, show_rownames = FALSE) Docs。这是由于SchemaType为Mixed (Object)

答案 1 :(得分:0)

我知道您已经解决了问题,但是我有个主意。 通常在这种情况下,我想获取文档并遍历该对象并找到该项目并将其删除并再次保存该文档。这是我的一种幼稚方式。