更新mongodb集合中的数组字段

时间:2016-02-13 11:58:32

标签: mongodb meteor

我正在尝试更新我的集合,其中包含一个数组字段(最初为空白),为此我正在尝试此代码

Industry.update({_id:industryId},
                {$push:{categories: id:categoryId,                                  
                        label:newCategory,
                        value:newCategory }}}});

没有显示错误,但在我的收藏中只创建了空文档({})。

注意:我同时拥有categoryIdnewCategory,因此没有任何问题。 提前谢谢。

这是架构:

Industry = new Meteor.Collection("industry");

Industry.attachSchema(new SimpleSchema({
    label:{
        type:String
    },
    value:{
        type:String
    },
    categories:{
        type: [Object]
    }
}));

2 个答案:

答案 0 :(得分:0)

如果在mongo shell中运行此查询,它将生成一个匹配的日志:1,更新:0。请检查一下你会得到什么。如果匹配为0,则表示您的输入查询没有任何匹配的文档。

答案 1 :(得分:0)

我不确定但也许错误正在发生,因为您没有验证'类别'在您的架构中。尝试添加' blackbox:true'到你的类别'所以它接受任何类型的对象。

Industry.attachSchema(new SimpleSchema({
    label: {
        type: String
    },
    value: {
        type: String
    },
    categories: {
        type: [Object],
        blackbox:true     // allows all objects
    }          
}));

完成后,尝试像这样添加值

var newObject = {
    id: categoryId,
    label: newCategory,
    value: newCategory
}
Industry.update({   
    _id: industryId
}, {
    $push: {
        categories: newObject     //newObject can be anything
    }
});

这将允许您将任何类型的对象添加到类别字段中。 但是你在评论中提到类别也是另一个集合。 如果您已经有类别的SimpleSchema,那么您可以验证categories字段以仅接受与SimpleSchema匹配的对象,例如

Industry.attachSchema(new SimpleSchema({
    label: {
        type: String
    },
    value: {
        type: String
    },
    categories: {
        type: [categoriesSchema]    // replace categoriesSchema by name of SimpleSchema for categories
    }          
}));

在这种情况下,只有与categoriesSchema匹配的对象才会被允许进入类别字段。任何其他类型都将被过滤掉。你也不会在控制台上遇到任何错误,试图插入其他类型。(这是我认为当你尝试现在插入时没有指定验证的情况下发生的事情)

编辑:解答说明

在SimpleSchema中定义一个对象数组时,你必须验证它,即你必须告诉它它可以接受哪些对象以及它可以接受什么。 例如,当您将其定义为

...
categories: {
    type: [categoriesSchema]    // Correct
} 

这意味着只能在其中插入与名为categoriesSchema的另一个SimpleSchema结构相似的对象。根据您的示例,您尝试插入的任何对象都应采用此格式

{
    id: categoryId,
    label: newCategory,
    value: newCategory
}

任何不符合此格式的对象都会在插入时被拒绝。这就是为什么你尝试插入的所有对象,当你最初尝试使用像这样的

结构的架构时,它被拒绝了
...
categories: {
    type: [Object]     // Not correct as there is no SimpleSchema named 'Object' to match with
}

<强> 黑箱:真

现在,假设您没有要过滤的对象,并希望无需验证即可插入所有对象。 设置&#34; blackbox:true&#34;进来。如果你定义一个像这样的字段

...
categories: {
    type: [Object],     // Correct
    blackbox:true
}

这意味着类别可以是任何对象,无需针对其他一些SimpleSchema进行验证。所以无论你试图插入什么都会被接受。