2017-07-18 40 views
0

我试图在我的Meteor应用程序中保存一个集合。未保存到指定的Mongo URL的流星 - 集合

到目前为止,我有这个代码简单位:

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

这将创建集合作为控制台日志证实了它的存在。但是,它不是在我指定的Mongo URL中创建它。

我在本地运行应用程序并使用以下命令指定蒙戈网址:

MONGO_URL='<MyURL>' meteor 

此字符串似乎当我注册了一个用户一个用户收藏的创建和应用工作我指定的数据库中的meteor_accounts_loginServiceConfiguration集合。

Collections

然而,创建集合“狗”的代码 - 这是连接到一个按钮点击 - 无法在数据库中创建一个新的集合,但它在其它地方创建。

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

而且,我已经尝试设置我的settings.json文件有以下几点:

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

和部署时指出应用到它。这似乎也是因为创建新用户更新了我的数据库中的“用户”集合。但是,问题依然存在,'Dogs'集合没有在我指定的Mongo数据库中创建。

有没有人知道为什么会出现这种情况?我错过了什么?

非常感谢您的帮助,

UPDATE

这个方法我试过:

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

我试过如下:

我创建了一个文件夹,名为服务器,并在其中一个叫主文件。 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中创建并且任务被插入到其中。

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

有什么建议吗?

谢谢!:)

回答

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

1

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

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

+0

我写从客户端是的。请你能解释我将如何写/调用一种方法? – GeorgeBT

+0

嗨@ d4nyll你可以看看我的更新问题 - 这是你的意思? – GeorgeBT

+0

它正在向写入方向移动。您使用Meteor方法来编写/更新数据库,并使用发布/预订来允许客户端从数据库读取数据。你可能会让他们混在一起。 我写了一个更加深入的流星教程 - https://scotch.io/tutorials/building-a-slack-clone-in-meteor-js-getting-started - 它可能是值得的看一看,因为它比meteor.com的教程更详细地解释了这些概念 – d4nyll