这是我之前question stackoverflow.com上的后续问题。
首先,感谢@David Weldon:我能够正确构建我的更新。但是,当我从数据库中获取输出时,我添加到score
接缝的对象将丢失。
这可能是db.ideas.find()
的默认行为。我期望在执行db.ideas.find()
时获得子文档。
我运行的代码:
Ideas.update("bKXXrpYmppFBfq9Kx", {
$addToSet: {
score: { userId: "W9YEs84QFhZzJeB6j", score: 1 },
votedOnBy: "W9YEs84QFhZzJeB6j"
},
$inc: {
overallScore: 1,
timesVotedOn: 1
}
});
mongo db console的输出:
meteor:PRIMARY> db.ideas.find()
{
"_id" : "bKXXrpYmppFBfq9Kx",
"title" : "Jump through the portal",
"body" : "The elves from Eldernland should jump through the blue portal mentioned in episode one.",
"userId" : "W9YEs84QFhZzJeB6j",
"author" : "Nate Beck",
"episodeId" : "LbDynnAHxAgM5PPXM",
"timestamp" : ISODate("2016-06-07T20:37:05.775Z"),
"votedOnBy" : [
"W9YEs84QFhZzJeB6j"
],
"timesVotedOn" : 3,
"score" : [
{
}
],
"overallScore" : 1
}
我原本期待看到"得分"这看起来像一个空物体。
任何想法在这里出错了什么?
答案 0 :(得分:0)
这里的问题是我不知道包aldeed:collection2对我的代码做了什么。我添加了此包以使用OrionJS(此处为github page)。我没有注意到这个aldeed:collection2强制验证我的所有更新。我以前碰到过这个,但它给了我一个错误。在过去,我能够追踪错误。这一次,任何地方都有没有错误。它会更新数组,但是会有一个空对象。太混乱了。我将在aldeed:collection2的项目页面上发布问题。
来自project documentation:" [aldeed:collection2是一个] Meteor包,允许您将模式附加到Mongo.Collection。 从客户端或服务器代码插入更新 时自动验证该架构。"
可以找到documentation进行更正here。
因为我使用aldeed:simple-schema和aldeed:collection2我需要确保附加一个正确的" Schema"到我的收藏。
喜欢如此:
Ideas.attachSchema(new SimpleSchema({
// ... a bunch of other schema data
// I was missing this:
score: {
type: [Object],
optional: true,
label: 'Score',
},
"score.$.userId": {
type: String,
optional: true,
label: 'Score'
},
"score.$.score": {
type: String,
optional: true,
label: 'Score'
}
// ... a bunch more schema data
});
我是怎么想出来的?
嗯,我是MongoDB的新手 - 所以我不愿意去控制台,只是尝试从那里做更新。事实上,在我与妻子谈话之前,这种情况甚至都没有发生过。
我尝试了所有内容,在 所有内容 周围添加引号,查看其他人的代码。我查看了MongoDB的所有优秀文档。我看了youtube视频。我查看了其他stackoverflow.com解决方案。最后,我发现其他人的代码看起来都和我的代码完全一样,这应该只是工作。我甚至在Clarity.fm注册了Sacha Greif每分钟1美元的问题。
......我开始认为我的mongo数据库不起作用。也许 我的mongo 安装被破坏了?
所以,好吧,有一个测试......经过两天的折磨,它终于来找我 - 只需在mongo控制台中尝试更新......(duh)
meteor:PRIMARY> db.ideas.update({_id:"DqEGjK3xSTBdpEgXa"}, {$addToSet: {score: {userId: "123456", score: 1}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
meteor:PRIMARY> db.ideas.find()
{
"_id" : "DqEGjK3xSTBdpEgXa",
"title" : "Revive Randolf With Bloodmagic",
"body" : "Bring Randolf back from the dead using witche's bloodmagic.",
"userId" : "Rz28ByKYM4Y8futFb",
"author" : "Iryna Iglehart",
"episodeId" : "iQaxyLPi5iaYtQngf",
"timestamp" : ISODate("2016-06-08T17:37:57.237Z"),
"score" : [
{
"userId" : "123456",
"score" : 1
}
],
"overallScore" : 0,
"votedOnBy" : [ ],
"timesVotedOn" : 0
}
一旦我知道mongo可以做我的更新 - 我 知道 问题必须与我的流星设置有关。如果这是一个问题,我现在会在流星上找到一个问题。我搜索了谷歌的每个黑暗角落,试图找出这个。
在我记得之前我没有奇怪的验证问题之前不久。除了这些验证问题总是出现错误。事实上,没有错误,数组只是用空对象更新,真的让我陷入了循环。
非常感谢@Michel Floyd和@David Weldon对此问题的所有帮助。
[Solved] How to Update An Array of Subdocuments on a MongoDB Collection in MeteorJS