mongo find selector导致不匹配的结果返回

时间:2013-04-14 16:44:58

标签: javascript mongodb meteor

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

2 个答案:

答案 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}}的帮助者返回游标将导致更具响应性的应用程序。