0

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 选择器匹配的所有文档的文档。

奖励积分:

假设我想检索一组文章的标题,其中对这些文章的引用(其 Articles 集合中的 Articles _id)已保存在用户集合中。

如此有效地,我将从用户集合中检索文章引用,并使用这些引用从文章集合中检索文章的标题。

代码/伪代码会是什么样子?类似于以下内容(我假设以下内容是查询/检索记录的一些最佳实践的完全混蛋)

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});
4

2 回答 2

2

对于那些对奖金问题感兴趣的人,您需要 MongoDB 的$in 运算符

如果这将在服务器上的发布方法中使用,那么您可能需要查看publish-with-relations

类似下面的函数将是检索信息的有效方法。它对数据库进行两次调用。使用该fields参数可以防止在 db 和 webserver 之间发送不必要的数据。

/**
 * 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
于 2013-04-15T04:01:57.147 回答
1

如果要在控制台中检查查询结果,请使用Entries.find(...).fetch()

Entries.find()返回一个cursor,这是一种用于有效呈现列表的构造,因此只有更改的条目需要重新呈现。从您使用的助手返回光标{{#each}}将导致应用程序响应速度更快。

于 2013-04-15T03:18:42.293 回答