如何从Mongo集合中查找并返回特定字段?

时间:2017-03-01 10:20:09

标签: mongodb meteor find mongodb-query

虽然我认为这是一个普遍的问题,但我找不到符合我需求的解决方案。

我有2个Mongo系列。 '用户'集合和第二个'dbInfos'。

现在,我有一个名为'Infos'的模板,并希望Mongo集合中已存在的字段在输入字段中显示给用户,以防集合中有数据。如果数据库中尚未提供数据,则应为空。

所以这是我的代码,在我想要捕获第二个集合中的字段之前,它可以正常工作。

    Template.Infos.onRendered(function() {

        $('#txtName').val(Meteor.user().profile.name);
        $('#txtEmail').val(Meteor.user().emails[0].address);

});

这两项工作很棒。

但我不知道如何从'dbInfos'集合查询信息,这不是'用户'集合。显然Meteor.user()。country不起作用,因为它不在'users'集合中。也许是一个find({})查询?但是,我不知道如何写它。

$('#txtCountry').val( ***query function***);

关于'dbInfos'的结构:每个对象的_id等于userId加上更多的字段,如country,city等......

{
"_id": "12345",
"country": "countryX",
"city": "cityY"
}

此外,当集合中的字段为空时,如何保证不显示任何内容?或者这是自动的,因为它只会返回一个空字段?

修改

我现在试过这个:

dbInfos.find({},{'country': 1, '_id': 0})

我认为这是检索国家/地区字段并抑制_id字段输出的正确语法。但我只将[object Object]作为回报。

1 个答案:

答案 0 :(得分:1)

你错过了外键的想法。集合中的每个项目都需要一个由mongo(通常)指定的唯一键。所以你的国家/地区信息的密钥与userId相同是不正确的,但是你关闭了。相反,您可以像这样引用userId:

{
  "_id": "abc123",
  "userId": "12345",
  "country": "countryX",
  "city": "cityY"
}

这里," abc123"该系列是独一无二的,由mongo和" 12345"分配。是Meteor.users中某些记录的_id。

所以你可以这样找到它(这将在客户端上,你已经订阅了DBInfos集合):

let userId = Meteor.userId();
let matchingInfos = DBInfos.find({userId: userId});

第一个userId是集合中字段的名称,第二个是来自登录用户的本地变量。

<强>更新

好吧,我想想我知道你在哪里绊倒它。 find()和findOne()之间存在差异。

find()返回一个游标,这可能是你获取[object object]的地方。 findOne()返回一个实际的对象。

对于两者,第一个参数是过滤器,第二个参数是选项字段。 e.g。

let cursor = DBInfos.find({
    userId: Meteor.userId()
  },
  {
    fields: {
      country: 1
    }
  });

这将是:

  1. 查找属于登录用户的所有记录
  2. 仅提供国家/地区和_id字段
  3. 以光标的形式提供该数据
  4. 游标允许您迭代结果,但它不是结果的JSON对象。如果你想使用&#34; {{#each}}&#34;光标很方便。例如,在HTML中。

    如果您只是将find()更改为findOne():

    let result = DBInfos.findOne({ /** and the rest **/
    

    ...现在你实际上有一个JSON结果对象。

    您还可以执行find / fetch的组合,其工作方式类似于findOne():

    let result = DBInfos.find({
        userId: Meteor.userId()
      },
      {
        fields: {
          country: 1
        }
      }).fetch();
    

    结果,您现在可以获得国家/地区:

    let country = result.country;
    
    顺便说一句,你不需要使用这些选项来获得国家。我一直在假设所有这些代码都在客户端上(可能是一个不好的假设)。所以这也将有助于这个国家:

    let result = DBInfos.findOne({userId: Meteor.userId()});
    let country = result.country;
    

    这里发生了什么?它就像上面一样,但结果JSON可能包含更多的字段而不仅仅是country和_id。 (这取决于发表的内容)。

    我在服务器上执行find()时通常会使用options字段来限制发布到客户端的内容。在客户端,如果您只需要抓住国家/地区字段,则不需要以这种方式指定选项。

    在该选项中,您还可以执行排序结果等操作。当您要在光标上进行迭代并希望按特定顺序显示结果时,可以在客户端上使用它。

    是否有意义?是什么让你绊倒?