2016-06-08 47 views
1

这是我以前的question这里的stackoverflow.com的后续问题。如何使用Meteor和MongoDB从阵列中的对象返回子文档

首先,感谢@David Weldon:我能够正确构建我的更新。但是,当我从数据库中获取输出时,我添加到score接缝处的对象将会丢失。

也许这是默认行为db.ideas.find()。我期望在执行db.ideas.find()时也可以获得子文档。

代码我跑:从蒙戈DB控制台

Ideas.update("bKXXrpYmppFBfq9Kx", { 
    $addToSet: { 
    score: { userId: "W9YEs84QFhZzJeB6j", score: 1 }, 
    votedOnBy: "W9YEs84QFhZzJeB6j" 
    }, 
    $inc: { 
    overallScore: 1, 
    timesVotedOn: 1 
    } 
}); 

输出:

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

'.find()'和'.findOne()'格式稍有不同的流星蒙戈控制台,尝试了后者。或尝试'db.ideas.findOne(id).score' –

+0

@Jeremy我怀疑你只是看到以前尝试插入的文档和/或你从多个地方插入。如果这是一个开发环境,请尝试执行'db.ideas.remove({})',然后再次启动该应用程序(或执行“流星重置”)。另请参阅[常见错误](https://dweldon.silvrback.com/common-mistakes)查找vs findOne与流星中的获取。 –

+0

[@Michel Floyd](http://stackoverflow.com/users/2805154/michel-floyd):感谢您的建议。我试过了,没有运气。这是[我的主机的输出:](https://git.io/vom7c)https://git.io/vom7c –

回答

0

!已解决!

这里的问题是,我不知道什么包aldeed:collection2正在做我的代码。我添加了这个包来使用OrionJS(这里是github page)。我没有注意到这aldeed:collection2是强制验证我所有的更新。我之前遇到过这个问题,但它给了我一个错误。在过去,我能够追查错误。这一次,有任何地方都没有错误。它会更新数组,但是有一个空对象。很混乱。我将在aldeed:collection2的项目页面上发布一个问题。

project documentation:“[aldeed:collection2是]流星包,允许你的模式附着到Mongo.Collection 插入和更新从客户端或服务器代码时自动验证针对该架构。”。

用于校正的documentation可以找到here


解决方法:

因为我使用aldeed:simple-schemaaldeed:collection2我需要确保以正确的“架构”连接到我的收藏。

像这样:

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上注册,以每分钟1美元的价格从Sacha Greif提问。

...我开始认为我的mongo数据库没有工作。也许我的mongo安装被打破了吗?

所以,好吧,对于一个测试。经过这样的折磨它终于来到了我两天 - 就尝试在蒙戈控制台更新......(杜)

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可以做我的更新 - 我知道问题必须与我的流星设置。如果这是一个问题,我现在会发现流星问题。我搜索谷歌的每个黑暗角落,试图找出这一个。

不久之前我记得我之前有奇怪验证问题。除了这些验证问题总是会出现错误。事实上没有错误,数组只是简单地用空对象更新,真的让我有一个循环。


我学到了什么:

  1. 如果在第一流星失败,请尝试蒙戈控制台...
  2. @David Weldon的评论 - 另一个很好的调试技术,它会帮助我,我很久以前就可以尝试的是开始一个新的流星计划,并在那里测试我的代码,然后一次添加一个软件包,并查看它/它们中的任何一个是否破坏代码。这个测试应该指出,从根本上说,代码是正确的,并且只需要附加的程序包就可以了。
  3. 请勿盲目添加包裹。了解如果/当包转变发展这样的流程为aldeed:collection2

谢谢:

非常感谢@Michel Floyd@David Weldon您对这个问题的所有帮助。


重要链接:

  1. 我学到common mistakes不少由@David Weldon
  2. documentation for aldeed:collection2
  3. documentation for aldeed:simple-schema
  4. 搜寻有关this meteor tutorial “查找数据” 写 - 它说话关于fetch()以及它如何有用。这帮助我解决了这个问题。
  5. 回顾documentation on about update从MongoDB的
  6. MongoDB $addToSet Documentation
  7. MongoDB $push Documentation
  8. [MongoDB的BIOS实例收藏](https://docs.mongodb.com/manual/reference/bios-example-collection/] - 它看着像这样,我真的想通了文件后,有什么错我的数据库设计,那里应该是一个办法做到这一点一直(且有,很明显)

相关问题:

[Solved] How to Update An Array of Subdocuments on a MongoDB Collection in MeteorJS

+0

好的写作。另一个重要的调试技巧是从一个空的项目开始,添加一些东西,直到它无法正常工作。在这种情况下,一个没有collection2的单文件应用程序会证明代码基本上是正确的。 –

+0

[@David Weldon](http://stackoverflow.com/users/635981/david-weldon):非常感谢 - 你说得对。有趣的是,我创建了一个项目来回答别人的问题[这里](http://stackoverflow.com/a/37692455/484732) - 我主要是为了让他清楚起见。但现在你说我意识到我也可以为自己做到这一点,但在我的情况下,作为一种调试技术。我是流星的新手(正如你所看到的)。非常感谢您的时间和关注。 –

相关问题