【问题标题】:Copied MongoDb from cloud9 to Mlab and new documents are saved in odd order to DB [duplicate]将MongoDb从cloud9复制到Mlab,新文档以奇数顺序保存到数据库[重复]
【发布时间】:2019-06-25 13:31:21
【问题描述】:

我第一次尝试在网站上使用数据库并遇到了一些奇怪的事情。我做了一个 webDev 课程,展示了如何创建一个使用 cloud9 进行所有开发的博客类型站点,然后使用 MongoDb 数据库将完成的站点部署到 Heroku,并在 Heroku 上拥有该站点后使用 Mlab 托管数据库。

一切都很好,但是当它还在 cloud9 上时,我将一堆集合和文档添加到数据库中,并且 webDev 课程的讲师从未讨论过如何将这个数据库移动到 Mlab。我找到了一些信息并使用 mongodump 命令保存了整个数据库,在 mlab 上找到了这段代码,我使用这个基本命令将 mongodump 放到 mlab 上:

  mongorestore -h ds153637.mlab.com:53637 -d nttw_db -c travels -u <user> -p <password> travels.bson

数据库似乎已经很好地传输了,我的网站在 heroku 上测试它时,似乎有我在 cloud9 上创建时最初存储在数据库中的所有数据。我现在遇到的问题是,当我添加到托管在 heroku 上的实时部署站点上的数据库时,数据库条目正在 Mlab 上以奇数顺序添加到集合中。这是一个博客类型的网站,其中包含远足小径和露营地以及对装备的评论,因此当我向小径添加新的测试条目时,新文档是在集合中的第一个条目之后添加的,但在其他 4 个条目之前添加。通常我输入的新数据会附加到集合的末尾,至少当数据库在 cloud9 上时我添加条目时它是这样工作的。这是我在服务器上的 app.js 中使用的代码,用于从我的网站上的表单中添加新条目:

router.post("/trail_new", isLoggedIn, function(req, res){

    var name = req.body.trail.name;
    var tags = req.body.trail.tags;
    var splash = req.body.trail.splashText;

    var thl     = req.body.trail.thl || "somewhere on earth.!";
    var fees    = req.body.trail.fees;
    var tl      = req.body.trail.tl;
    var info    = req.body.trail.info;

    var body = req.body.trail.body;
    var adRight = req.body.trail.adRight || "none";
    var photos = req.body.reviewPhoto;

    tags = tags.split(",");

    //Assemble a variable to send all the review data into the create function for the SCHEMA pattern
    var newTrail = { name: name, tags: tags, splashText: splash, thl: thl, fees: fees, tl: tl, info: info, body: body, adRight: adRight, photos: photos };

    Trail.create( newTrail, function(err, travel){ 
        if(err){
            console.log(err);
            res.redirect("trail/new");
        }else{
            console.log(travel);
            res.redirect("/trail");
        }
    });
});

我确信上面的代码中有一些不太优雅的行,但是对于将条目添加到数据库中似乎一切正常。关于 Mlab 如何添加到数据库中,我是否忽略了什么?我不知道为什么在每个集合中的第一个条目之后以及在将 mongodump 复制到 Mlab 之前都存在的其他条目之前将新条目插入到数据库中。在cloud9开发环境上运行的mongo版本是v3.6.9,Mlab版本是3.6.6(MMAPv1)。不确定这是否重要。

我真的很不想重新创建我在 cloud9 上时已经在数据库中创建的所有内容,但是如果我必须擦除数据库并在 Mlab 上重新开始,我可以做到。它甚至可能不是问题,但它让我有点担心,新条目没有以正确的顺序放入数据库中,并且不希望它以某种方式破坏数据库,如果有我不知道的问题不知道。

任何信息都会很棒。这是使用数据库的第一次尝试,它们非常酷,但对于初学者来说却很困惑。!

谢谢

E

【问题讨论】:

  • 除非您指定明确的排序顺序(或使用上限集合),否则无法保证文档的返回顺序。您没有包含显示如何查找条目的代码 sn-p,但应该包含 sort() 标准。如果没有排序标准,自然顺序可能会巧合地显示为插入顺序,但绝对不能保证在文档被修改或删除时保持不变。

标签: node.js database mongodb heroku mlab


【解决方案1】:

您需要了解 IMO 的关键是,在 MongoDB 中,数据存储为一个大的 JSON blob。从定义上讲,JSON 是一个松散的键值对块。对象的顺序在 JSON 中并不重要,您应该记住这一点。因此,当您在 C9 中转储数据并在 Mlab 中上传时,没有人关心 JSON 对象的顺序,您会看到顺序混乱。将此特定点视为使用 NOSQL 数据库的一个小缺点并继续前进。

P.S 你参加过 Steele 的 Udemy Bootcamp 课程吗?

【讨论】:

  • 啊好吧,当我将数据库带入 Mlab 时,它令人惊讶地保持了所有整体的顺序,但是当它们被添加到 Mlab 上的数据库中时,新添加的内容就不是“按顺序”了。是的,这就是我在 udemy 上做的训练营。这是我第一次接触 web 开发,我认为它非常好,但是一旦课程展示了如何在 cloud9 中设置 mongoDB 并开始填充数据库,然后在他展示如何设置 Mlab 时接近尾声,我就跳了起来db,没有提到将您的 db 从 cloud9 转移到 Mlab 的任何内容。
  • 是的,伙计。迁移数据库时,我遇到了同样的问题。条目的顺序无关紧要,所以不要担心它。另外,如果有帮助,请接受答案:)
  • 完成!我在 Mlab 中查看数据库条目,这比在 mongo 控制台中查看它们更酷更好,并且我创建的新条目看起来与数据库在 cloud9 中时创建的条目相同。所以我想这不是问题。谢谢。 -E
  • 实际上,MongoDB 确实将数据存储为 JSON blob,尽管 JSON 是一种从客户端角度考虑序列化的便捷方式。 MongoDB 用于存储和有线协议的底层格式是BSON,这是一种类似 JSON 的二进制格式,支持其他数据类型。有关 JSON 与 BSON 的更多背景信息,请参阅:Why does MongoDB check for order of keys when matching embedded documents?。文档中键的顺序与这些文档在存储层的排序方式无关。
  • @Stennie 您分享的链接是我读过的最好的文章之一!谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2013-09-19
  • 1970-01-01
  • 2018-04-14
  • 2011-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多