在 Meteor 中,在 Mongo shell 中看不到 MongoDB 更新
In Meteor, a MongoDB update is not seen in the Mongo shell
这是一个很奇怪的问题。
我是 运行 中的 cursor.observe()
中的 Tracker.autorun()
,但是只有在我刷新页面时才会发生变化。这是重要的代码:
客户端
Tracker.autorun(function (){
var initializing = true;
Links.find().observe({
added: function(doc){
var parents = Links.find({stacks: {$exists: true, $not: {$size: 0}}});
//Find the parent of this item with a stack array
if(!initializing){
_.each(parents.fetch(), function(parentDoc){
_.each(parentDoc.stacks, function (stackId){
//The troublesome server call
Meteor.call("addLinksFromDirToStack",
stackId, parentDoc.shared[0].id, parentDoc._id);
});
});
}
initializing = false;
}
});
});
服务器端
Meteor.methods({
addLinksFromDirToStack: function(stackId, userId, dirId){
var stack = Stacks.findOne(stackId);
if (stack){
var webArray = stack.webArray;
webArrayFiller(dirId, webArray);
Stacks.update(stackId, {$set: {webArray: webArray}});
Stacks.update(stackId, {$addToSet: {users: userId}});
}
// NOTE: IF I QUERY THE STACKS COLLECTION HERE, I SEE THE CHANGES
}
});
webArrayFiller = function(dirId, webArray){
//Update array
}
如上所述,如果我在更新后直接查询 Stacks 集合,更改会反映在数据库中。 但是,从Mongo Shell查询,我仍然看到旧的堆栈,没有更新。这是客户端的情况,应该显示更改。
我试过 Meteor Reset 没有用。任何帮助将不胜感激。
我明白了为什么它不起作用。
我并没有发布 Stacks
集合的每个字段。特别是 users
字段。因此,当我尝试用这一行更改集合时,它会失败:
Stacks.update(stackId, {$addToSet: {users: userId}});
但是,Minimongo 识别了这个变化,所以我的查询会错误地告诉我我已经成功了。一旦服务器拒绝了更新,它也会拒绝直接在上面的行,使得这两个更改都不会发生。显然,有些人发现 MongoDB 在失败的交易中缺少错误消息很麻烦。它确实使这个错误很难被发现。
解决方案是将服务器端代码包装在 if (Meteor.isServer)
中,这样在服务器端它只会是 运行。一个不幸的结果是,由于异步性,无法轻易地从这些调用返回值,但有解决方法。
这是一个很奇怪的问题。
我是 运行 中的 cursor.observe()
中的 Tracker.autorun()
,但是只有在我刷新页面时才会发生变化。这是重要的代码:
客户端
Tracker.autorun(function (){
var initializing = true;
Links.find().observe({
added: function(doc){
var parents = Links.find({stacks: {$exists: true, $not: {$size: 0}}});
//Find the parent of this item with a stack array
if(!initializing){
_.each(parents.fetch(), function(parentDoc){
_.each(parentDoc.stacks, function (stackId){
//The troublesome server call
Meteor.call("addLinksFromDirToStack",
stackId, parentDoc.shared[0].id, parentDoc._id);
});
});
}
initializing = false;
}
});
});
服务器端
Meteor.methods({
addLinksFromDirToStack: function(stackId, userId, dirId){
var stack = Stacks.findOne(stackId);
if (stack){
var webArray = stack.webArray;
webArrayFiller(dirId, webArray);
Stacks.update(stackId, {$set: {webArray: webArray}});
Stacks.update(stackId, {$addToSet: {users: userId}});
}
// NOTE: IF I QUERY THE STACKS COLLECTION HERE, I SEE THE CHANGES
}
});
webArrayFiller = function(dirId, webArray){
//Update array
}
如上所述,如果我在更新后直接查询 Stacks 集合,更改会反映在数据库中。 但是,从Mongo Shell查询,我仍然看到旧的堆栈,没有更新。这是客户端的情况,应该显示更改。
我试过 Meteor Reset 没有用。任何帮助将不胜感激。
我明白了为什么它不起作用。
我并没有发布 Stacks
集合的每个字段。特别是 users
字段。因此,当我尝试用这一行更改集合时,它会失败:
Stacks.update(stackId, {$addToSet: {users: userId}});
但是,Minimongo 识别了这个变化,所以我的查询会错误地告诉我我已经成功了。一旦服务器拒绝了更新,它也会拒绝直接在上面的行,使得这两个更改都不会发生。显然,有些人发现 MongoDB 在失败的交易中缺少错误消息很麻烦。它确实使这个错误很难被发现。
解决方案是将服务器端代码包装在 if (Meteor.isServer)
中,这样在服务器端它只会是 运行。一个不幸的结果是,由于异步性,无法轻易地从这些调用返回值,但有解决方法。