userLink_titles = Entries.find({ _id:"bxSbMgszYxbCqDonF"})
返回:
docs: Object
CBqHrJvTE8xz7u2Rz: Object
_id: "CBqHrJvTE8xz7u2Rz"
author: "AHSwfYgeGmur9oHzu"
Q8m7PMbQr62E3A73f: Object
_id: "Q8m7PMbQr62E3A73f"
author: "AHSwfYgeGmur9oHzu"
bxSbMgszYxbCqDonF: Object
_id: "bxSbMgszYxbCqDonF"
author: "AHSwfYgeGmur9oHzu"
正如您所看到的,它会返回正确的文档,但它也会返回不正确的文档。
findOne:userLink_titles = Entries.findOne({ _id:"bxSbMgszYxbCqDonF"})
按预期工作,只返回正确的文档。
我会使用findOne,但最终目的是使_id选择器成为一个数组,以便find返回与数组中的_id选择器匹配的所有文档的文档。
奖励积分:
假设我想检索一组文章的标题,其中对这些文章的引用(文章集合中文章的_ids)已保存在用户集合中。
因此,我会从用户集合中检索文章引用,并使用这些引用从文章集合中检索文章的标题。
代码/伪代码会是什么样的?类似下面的内容(我假设以下是对查询/检索记录的一些最佳实践的完全混淆)
user_profile = Users.findOne({username : "Frank"});
user_saved_articles_ids = user_profile.findOne({saved_articles_ids});
userLinks = Articles.find({ _id:user_saved_articles_ids});
userLinksTitles = Articles.find({titles});
答案 0 :(得分:2)
对于那些对奖金问题感兴趣的人,您需要MongoDB的$in operator。
如果这将在服务器上的发布方法中使用,那么您可能需要查看publish-with-relations。
以下功能之类的东西将是检索信息的有效方式。它对数据库进行两次调用。使用fields
参数可以防止在db和Web服务器之间发送不必要的数据。
/**
* Titles of a User's saved articles
*
* @method getSavedTitles
* @param {String} username
* @return {Array} a list of article titles
*/
function getSavedTitles (username) {
var user,
ids,
linkedArticles,
titles;
user = Users.findOne({username: username},
{fields:{ _id:0, profile:1 }});
if (!user || !user.profile) {
throw new Meteor.Error(500, 'Missing user profile');
}
ids = user.profile.savedArticleIds;
if (!ids || !_.isArray(ids)) {
throw new Meteor.Error(500, 'Missing saved article ids');
}
linkedArticles = Articles.find({_id: {$in: ids}},
{fields:{ _id:0, title:1 }});
titles = _.pluck(linkedArticles.fetch(), "title");
return titles;
} // end getSavedTitles
答案 1 :(得分:1)
如果要在控制台中检查查询结果,请使用Entries.find(...).fetch()
Entries.find()
返回cursor,这是一个用于有效呈现列表的构造,因此只需要重新呈现更改的条目。从您使用{{#each}}
的帮助者返回游标将导致更具响应性的应用程序。