【问题标题】:Meteor Mongo Not Getting Collection DataMeteor Mongo 未获取收集数据
【发布时间】:2015-11-17 14:46:10
【问题描述】:

我正在尝试从集合中获取文档,但它似乎不起作用。

当我使用 find().fetch() 时,它只返回一个空数组。我的代码如下。

var users = new Mongo.Collection("users");
console.log(users.find());
var userRecord = users.find().fetch();
var returnUserRecord = {};

if (userRecord.length >0){
    returnUserRecord = {username:userRecord.username, loginHash:userRecord.loginHash};
    console.log("if statement is not complete and the value of the return variable is");
    console.log(returnUserRecord);
}

return returnUserRecord

我直接查了数据库,发现集合里确实有一个文档,用命令:

meteor mongo

如果有任何区别,所有这些代码都在服务器 js 文件中,并通过以下方式从客户端调用:Meteor.Methods()/Meteor.call()

编辑 1

我使用来自客户端的新数据创建了另一个集合,在选择正确的数据库并运行命令后:

meteor:PRIMARY> db.newCollection1.find()

我明白了:

{ "_id" : ObjectId("55d1fa4686ee75349cd73ffb"), "test1" : "asdasd", "test2" : "dsadsa", "test3" : "qweqwe" }

所以这确认它在数据库中可用,但是在客户端控制台中运行以下命令,仍然没有返回结果。 (安装了自动发布。我尝试删除自动发布并进行了适当的更改以订阅表格,但这也不起作用)。

var coll = new Meteor.Collection('newCollection1');
coll.find().fetch()

这返回了一个空数组。我也在 server.js 代码上尝试了同样的方法:

meteor debug

但我仍然得到一个空数组。有谁知道我在这里可能做错了什么?

解决方案

解决方案是在 Meteor 对象上下文中创建集合变量。这样就可以从 Meteor 上下文中访问它。

Meteor.coll = new Meteor.Collection('newCollection1');
Meteor.coll.find().fetch();

我希望这对某人有所帮助。根据您的代码,您可能希望使用不同的上下文。

【问题讨论】:

  • 不应该是return users.find().fetch();,基本上没有别的。您定义:var returnUserRecord = {}; return returnUserRecord; 当然只是一个空对象。只有前一行(如图所示修改)实际上做了任何事情来检索集合数据。
  • 您是否从您的应用程序中删除了auto-publish 包?如果是,请将其添加到您的应用程序中,并检查是否得到正确的结果;如果没有,在浏览器检查器中运行 users.find().fetch() 会得到什么?
  • 请查看我的编辑 1。我尝试添加和删除自动发布。当我删除自动发布时,我使用了以下 Ryan Wu 提供的信息。

标签: javascript node.js mongodb meteor


【解决方案1】:

您无需等待此订阅完成,因此您会得到空数组。

您应该阅读thisthis 以更好地理解它。

问题是您将 users 变量连接到“users”集合,当您调用它时,它还没有被数据污染(如果您不想使用订阅,那么可以使用 helper - 它是反应性的,所以它会订阅完成后返回正确的值)

【讨论】:

    【解决方案2】:

    您是否在某个地方订阅了您的users 收藏?

    if (Meteor.isServer) {
      Meteor.publish("users", function(){
         return Users.find({})
      });
    }
    
    if (Meteor.isClient) {
      Meteor.subscribe("users");
    }
    

    【讨论】:

    • 谢谢,但这也不起作用。我也尝试添加自动发布包,但仍然没有区别。 (除了控制台中的调试消息告诉我,如果安装了自动发布包,我不需要发布/订阅。
    • 那么它的用户收藏?你试过Meteor.users.find().fetch() 吗?
    • 这确实有效,但你需要return Users.find({})
    【解决方案3】:

    首先一些建议:你不能定义一个集合两次。如果您再次拨打new Mongo.Collection("users"),您将收到错误消息。因此,它应该是一个全局变量,而不是在方法中。

    我在您的代码中看到的是您正在尝试将数组用作对象。 userRecord.username 不起作用,因为 userRecord 具有返回数组的 fetch() 的值。

    您可以将代码更改为 userRecord[0].username 或使用 forEach 循环遍历结果,如下所示:

    var users = new Mongo.Collection("users");
    console.log(users.find());
    users.find().forEach(function(singleUser){
        console.log(EJSON.stringyfy(singleUser));
    }
    

    为了返回第一个用户,最好使用findOne,它返回结果中的第一个对象。

    【讨论】:

    • 谢谢,但我仍然得到“未定义”。输入:coll.find().forEach(function(singleUser){ console.log(EJSON.stringyfy(singleUser)); }) 输出:未定义
    • 这与'userRecord[0].username'相同,这是预期的,因为'users.find().fetch()'返回的结果是'[]'(空数组) .
    • 如果 singleUser 未定义,这意味着您的集合不包含任何用户。为了验证这一点,您应该在调试模式下运行代码并尝试在控制台中查询用户集合。这样您就可以知道发生了什么,并且可以排除故障。
    • 谢谢。这听起来合乎逻辑,这就是我的假设,但是当我使用“meteor mongo”直接查询数据库时,我可以看到记录。请参阅上面的“编辑 1”部分,我在其中创建了一个新集合。
    • 如果您在调试中运行代码,您可能会看到出了什么问题。您可以尝试不同的查询方式。例如 users.find({}) 而不是 users.find() 你也可以尝试 users.insert({...}) 并检查你是否在集合中得到了一些东西。您的问题是由于查找中的拼写错误,或者您在代码中查询时没有检查流星 mongo 中的同一集合,或者您的应用程序是使用 MONGO_URL 环境变量集调用的
    猜你喜欢
    • 1970-01-01
    • 2014-12-01
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    相关资源
    最近更新 更多