【发布时间】:2015-10-29 10:37:09
【问题描述】:
我的 Meteor 1.1.0.2 应用中有以下(简化的)SimpleSchema 架构:
Tickers.attachSchema(
new SimpleSchema({
entries: {
type: [TickerEntries],
defaultValue: [],
optional: true
}
})
);
TickerEntries = new SimpleSchema({
id: {
type: String,
autoform: {
type: "hidden",
label: false,
readonly: true
},
optional: true,
autoValue: function () {
if (!this.isSet) {
return new Mongo.Collection.ObjectID()._str;
}
}
},
text: {
type: String,
label: 'Text'
}
};
在数据库中,我确实有以下条目:
{
"_id" : "ZcEvq9viGQ3uQ3QnT",
"entries" : [
{
"text" : "a",
"id" : "fc29774dadd7b37ee0dc5e3e"
},
{
"text" : "b",
"id" : "8171c4dbcc71052a8c6a38fb"
}
]
}
我想删除由 ID 指定的条目数组中的一个条目。
如果我在 meteor-mongodb-shell 中执行以下命令,它可以正常工作:
db.Tickers.update({_id:"3TKgHKkGnzgfwqYHY"}, {"$pull":{"entries": {"id":"8171c4dbcc71052a8c6a38fb"}}})
但问题是,如果我要在 Meteor 中做同样的事情,它就行不通。这是我的代码:
Tickers.update({id: '3TKgHKkGnzgfwqYHY'}, {$pull: {'entries': {'id': '8171c4dbcc71052a8c6a38fb'}}});
我还尝试了以下方法:
Tickers.update('3TKgHKkGnzgfwqYHY', {$pull: {'entries': {'id': '8171c4dbcc71052a8c6a38fb'}}});
这些命令都没有给我错误,但它们不会从我的文档中删除任何内容。
有没有可能,$pull 命令没有得到正确支持,或者我在某处犯了错误?
提前致谢!
编辑:
我发现了这个问题,在我的描述中看不到,因为我已经简化了我的架构。在我的应用程序中,TickerEntries 中有一个附加属性 timestamp:
TickerEntries = new SimpleSchema({
id: {
type: String,
optional: true,
autoValue: function () {
if (!this.isSet) {
return new Mongo.Collection.ObjectID()._str;
}
}
},
timestamp: {
type: Date,
label: 'Minute',
optional: true,
autoValue: function () {
if (!this.isSet) { // this check here is necessary!
return new Date();
}
}
},
text: {
type: String,
label: 'Text'
}
});
感谢 Kyll 的提示,我创建了一个 Meteorpad 并发现 autovalue 函数导致了问题。
我现在将函数更改为以下代码:
autoValue: function () {
if (!this.isSet && this.operator !== "$pull") { // this check here is necessary!
return new Date();
}
}
现在它正在工作。似乎,在拉取项目/对象的情况下返回自动值值,它取消拉取操作,因为该值未设置为返回值(因此时间戳属性保留旧值但未拉取)。
这是用于测试它的相应 Meteorpad(只需注释掉自动值函数中对运算符的检查):http://meteorpad.com/pad/LLC3qeph66pAEFsrB/Leaderboard
感谢大家的帮助,大家的帖子对我很有帮助!
【问题讨论】:
-
我建议起草一个MeteorPad 来显示您的问题(创建数据库,添加架构,填充它,尝试删除并显示失败)。另一点:删除附加的模式是否会改变您的问题?如果不是,您可能希望将它们完全从问题中删除,因为现在我真的不知道模式是否具有任何重要性。最后,恭喜您帖子的格式和清洁度!如果您在问题中添加javascript 标签,它会自动为代码添加颜色。
-
我建议你在某处犯了错误或配置错误或冲突。我提交的答案显示了一个完整的工作案例。如果有其他东西干扰
$pull的预期行为,它应该有助于缩小您可能遇到的任何问题@ -
修复了我们的问题 - 自动值阻止了 $pull。感谢您对@reini122 的全面提问和回答。
-
澄清一下:我遇到了完全相同的问题,但我还必须在“自动值”上添加“if (!this.isSet && this.operator !== "$pull")” ”的“id”使一切正常。发现这一点真是太棒了!
标签: javascript mongodb meteor mongodb-query