Meteor - 集合未保存到指定的Mongo URL

时间:2017-07-18 09:33:08

标签: javascript mongodb meteor

我正在尝试在Meteor应用程序中保存一个集合。

到目前为止,我有一些简单的代码:

MyCollection = new Mongo.Collection("Dogs"); console.log(MyCollection.find({}));

这会在控制台日志确认其存在时创建集合。但是,它不会在我指定的Mongo URL中创建它。

我在本地运行应用程序并使用以下命令指定Mongo URL:

MONGO_URL='<MyURL>' meteor

当我将用户注册到应用程序时创建用户集合以及我指定的数据库中的meteor_accounts_loginServiceConfiguration集合时,此字符串似乎有效。

Collections

但是,创建集合'Dogs'的代码 - 附加到按钮单击 - 无法在数据库中创建新集合,但它正在其他地方创建。

我只能假设这是由Meteor提供的本地Mongo创建的?

另外,我尝试使用以下内容设置我的settings.json文件:

{
  "galaxy.meteor.com": {
    "env": {
      "MONGO_URL": "<MongoURL>"
    }
  }
}

并在部署期间将应用程序指向它。这似乎也起到了创建新用户更新数据库中“用户”集合的作用。但是,问题仍然存在,即未在我指定的Mongo数据库中创建“Dogs”集合。

有没有人知道为什么会这样?我错过了什么?

非常感谢你的帮助,

更新

我试过这个方法:

var database = new MongoInternals.RemoteCollectionDriver("<mongo url>");
MyCollection = new Mongo.Collection("collection_name", { _driver: database });

我在此处找到了:Using Multiple Mongodb Databases with Meteor.js

但是这无法在我的MongoDB中创建任何集合。

另一次更新

看了这个问题之后:

https://forums.meteor.com/t/how-to-view-collection-contents-using-console-log/23852/12

我尝试了以下内容:

我创建了一个名为server的文件夹,其中包含一个名为main.js的文件,其中包含以下内容:

const Tasks = new Mongo.Collection('tasks');

Tasks.insert({_id: 'my-todo'});

if (Meteor.isServer) {
  // This code only runs on the server
  Meteor.publish('tasks', function() {
    return Tasks.find();
  });
}

在我的客户端应用程序中,我将以下代码添加到我的JS文件中:

if (Meteor.isClient) {
  Meteor.subscribe('tasks');
}

根据帮助论坛,这应该有用。

部分工作 - 在我指定的Mongo URL中创建任务集合,并将任务插入其中。

但是,我现在不知道如何在客户端显示它。

有什么建议吗?

谢谢!:)

2 个答案:

答案 0 :(得分:1)

您是否说过要从客户端写入数据库?如果是这种情况,那么请确保您允许客户端写入,或者更好地在写入数据库的服务器上创建方法,并且客户端调用该方法。

我认为正在发生的是它正在客户端的minimongo实例上编写,并且不会与服务器上的数据库同步。

答案 1 :(得分:0)

此问题现已得到解决 - 感谢Rob Fallows提供了一些非常有用的帮助。

文件结构已稍微更改,现在包含以下文件夹和文件:

  • 进口/ task.js
  • 的客户机/ main.js
  • 服务器/ main.js

export const Tasks = new Mongo.Collection('tasks');位于imports / task.js文件中,因为它需要在客户端和服务器端执行。随后,发布和订阅将发挥作用,因为客户端上的(minimongo)集合将与实际数据库集合同步。

所以现在文件看起来像这样:

... task.js

// imports/Tasks.js
import { Mongo } from 'meteor/mongo';

export const Tasks = new Mongo.Collection('tasks');

的客户机/ main.js ...

import { Tasks } from '/imports/tasks';

Meteor.subscribe('tasks');

window.Tasks = Tasks;

服务器/ main.js ...

import { Tasks } from '/imports/tasks';

Tasks.insert({_id: 'my-todo'});

// This code only runs on the server
Meteor.publish('tasks', function() {
    return Tasks.find();
});

使用MONGO_URL='<MyURL>' meteor命令从命令行提供应用程序时,在MongoDB数据库中可以看到任务节点。

现在,当在浏览器的客户端输入控制台命令Tasks.find().fetch();时,将返回数据:

Console Log

可以找到更详细的完整答案here