Javascript 通过Meteor从阵列中提取条目
我在Meteor 1.1.0.2应用程序中使用了以下(简化的)SimpleSchema模式:Javascript 通过Meteor从阵列中提取条目,javascript,mongodb,meteor,mongodb-query,Javascript,Mongodb,Meteor,Mongodb Query,我在Meteor 1.1.0.2应用程序中使用了以下(简化的)SimpleSchema模式: Tickers.attachSchema( 新单纯形({ 参赛作品:{ 类型:[TickerEntries], 默认值:[], 可选:true } }) ); TickerEntries=新SimpleSchema({ 身份证:{ 类型:字符串, 自动形成:{ 类型:“隐藏”, 标签:假, 只读:正确 }, 可选:true, 自动值:函数(){ 如果(!this.isSet){ 返回新的Mongo.Co
Tickers.attachSchema(
新单纯形({
参赛作品:{
类型:[TickerEntries],
默认值:[],
可选:true
}
})
);
TickerEntries=新SimpleSchema({
身份证:{
类型:字符串,
自动形成:{
类型:“隐藏”,
标签:假,
只读:正确
},
可选:true,
自动值:函数(){
如果(!this.isSet){
返回新的Mongo.Collection.ObjectID();
}
}
},
正文:{
类型:字符串,
标签:“文本”
}
};
在数据库中,我有以下条目:
{
“_id”:“ZCEVQ9VIGQ3UQQNT”,
“条目”:[
{
“文本”:“a”,
“id”:“FC29774DD7B37EE0DC5E3E”
},
{
“文本”:“b”,
“id”:“8171c4dbcc71052a8c6a38fb”
}
]
}
我想删除ID指定的entries数组中的一个条目
如果我在meteor mongodb shell中执行以下命令,它将正常工作:
db.Tickers.update({u id:“3TKgHKkGnzgfwqYHY”},{“$pull”:{“条目”:{“id:“8171c4dbcc71052a8c6a38fb”}})
但问题是,如果我要从Meteor内部执行相同的操作,它将不起作用。以下是我的代码:
Tickers.update({id:'3TKGHKGNZGFWQYHY'},{$pull:{'entries':{'id':'8171c4dbcc71052a8c6a38fb'}});
我还尝试了以下方法:
Tickers.update('3Tkghkgnzgfwqyhy',{$pull:{'entries':{'id':'8171c4dbcc71052a8c6a38fb'}});
这些命令都没有给我一个错误,但它们不会从我的文档中删除任何内容
是否有可能,$pull
命令不受正确支持,或者我在某个地方犯了错误
提前谢谢
编辑:
我发现了这个问题,在我的描述中看不到,因为我简化了模式。在我的应用程序中,tickertries
中有一个附加属性timestamp
:
tickertries=new SimpleSchema({
身份证:{
类型:字符串,
可选:true,
自动值:函数(){
如果(!this.isSet){
返回新的Mongo.Collection.ObjectID();
}
}
},
时间戳:{
类型:日期,
标签:“分钟”,
可选:true,
自动值:函数(){
如果(!this.isSet){//这里的检查是必要的!
返回新日期();
}
}
},
正文:{
类型:字符串,
标签:“文本”
}
});
多亏了Kyll的提示,我创建了一个Meteopad并发现,autovalue
函数导致了这些问题
我现在已将函数更改为以下代码:
autoValue:function(){
如果(!this.isSet&&this.operator!==“$pull”){//这里的检查是必要的!
返回新日期();
}
}
现在它开始工作了。看起来,在拉取项/对象的情况下返回一个autovalue值,它取消了拉取操作,因为该值没有设置为返回值(因此timestamp属性保留旧值,但不会拉取)
下面是测试它的方法(只需注释掉autovalue函数中的运算符检查):
谢谢大家的帮助,你们所有的帖子都对我很有帮助!对于一个基本的meteor应用程序,我称之为“bunk”。如果你创建了一个全新的项目,并简单地定义了集合,那么操作员的工作就如预期的那样: 控制台: meteor创建票据 cd票 流星赛跑 然后打开外壳并插入数据: 流星蒙戈 >db.tickets.insert(data)//正好是问题中的数据 然后只需生成一些基本代码和模板: tickers.js
Tickers=新流星系列(“Tickers”);
if(Meteor.isClient){
Template.body.helpers({
“tickers”:函数(){
返回Tickers.find({});
}
});
}
if(Meteor.isServer){
Meteor.startup(函数(){
//启动时在服务器上运行的代码
});
}
tickers.html
股票行情
欢迎来到流星!
{{{#每个股票行情}
{{>ticker}
{{/每个}}
{{{u id}}
{{{#每个条目}}
{{>条目}
{{/每个}}
{{id}}-{{text}
应用程序应该运行正常,因此在浏览器控制台中执行.update()
(缩进以供阅读):
Tickers.update(
{“_id”:“zcevq9vigq3uqqnt”},
{“$pull”:{“entries”:{“id”:“fc29774dd7b37ee0dc5e3e”}}
)
该项目从条目中删除,页面刷新时没有该项目。因此,一切都消失了,正如预期的那样
即使添加和包,这里也没有区别:
meteor add-aldeed:简单模式
流星添加桤木:收藏2
tickers.js
Tickers=新流星系列(“Tickers”);
TickerEntries=新SimpleSchema({
“id”:{
类型:字符串,
可选:true,
autoValue:function(){
如果(!this.isSet){
返回新的Mongo.Collection.ObjectID()
}
}
},
“文本”:{
类型:字符串
}
});
附件(
新单纯形({
条目:{type:[TickerEntries]}
})
);
if(Meteor.isClient){
Template.body.helpers({
“tickers”:函数(){
返回Tickers.find({});
}
});
}
if(Meteor.isServer){
Meteor.startup(函数(){
//启动时在服务器上运行的代码
});
}
重新初始化数据并在浏览器控制台中运行相同的命令,所有内容都保持不变
在您自己的操作或其他操作中检查此错误或任何键入错误
arr: {
type:Array,
optional:true
}
Coll.update({}, {$pull: {arr: ''}}, {getAutoValues: false});