如何使用Meteor和MongoDB从数组中的对象返回子文档

时间:2016-06-08 14:15:47

标签: javascript arrays mongodb object meteor

这是我之前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
}

我原本期待看到"得分"这看起来像一个空物体。

任何想法在这里出错了什么?

1 个答案:

答案 0 :(得分:0)

!解决!

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

来自project documentation:" [aldeed:collection2是一个] Meteor包,允许您将模式附加到Mongo.Collection。 从客户端或服务器代码插入更新 时自动验证该架构。"

可以找到documentation进行更正here

解决方案:

因为我使用aldeed:simple-schemaaldeed: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可以做我的更新 - 我 知道 问题必须与我的流星设置有关。如果这是一个问题,我现在会在流星上找到一个问题。我搜索了谷歌的每个黑暗角落,试图找出这个。

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

我学到了什么:

  1. 如果最初流星失败,请尝试使用mongo控制台......
  2. 根据@David Weldon的评论 - 另一个很好的调试技术可以帮助我,我可以在很久以前尝试过这个技术,就是启动一个新的流星项目并测试我的代码,然后一次添加一个包,看看它/它们中的任何一个是否破坏了代码。这个测试会指出基本上代码是正确的,并且只需要附加的模式,因为添加了包。
  3. 不要盲目添加包裹。了解是否/何时包改变了开发流程,例如aldeed:collection2
  4. 谢谢:

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

    重要链接:

    1. 我从common mistakes
    2. 撰写的@David Weldon中学到了很多东西
    3. documentation for aldeed:collection2
    4. documentation for aldeed:simple-schema
    5. 搜索"查找数据"在this meteor tutorial上 - 它讨论了fetch()及其有用的方法。在我对此问题进行故障排除时,这有助于我。
    6. 查看MongoDB中的documentation on about update
    7. MongoDB $addToSet Documentation
    8. MongoDB $push Documentation
    9. [MongoDB Bios示例集合](https://docs.mongodb.com/manual/reference/bios-example-collection/] - 在查看这样的文档之后,我确实发现我的数据库设计没有任何问题,应该一直都是这样做的(并且显然有)
    10. 相关问题:

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