虽然我认为这是一个普遍的问题,但我找不到符合我需求的解决方案。
我有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]作为回报。
答案 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
}
});
这将是:
游标允许您迭代结果,但它不是结果的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字段来限制发布到客户端的内容。在客户端,如果您只需要抓住国家/地区字段,则不需要以这种方式指定选项。
在该选项中,您还可以执行排序结果等操作。当您要在光标上进行迭代并希望按特定顺序显示结果时,可以在客户端上使用它。
是否有意义?是什么让你绊倒?