javascript - 根据_id限制发布限制

标签 javascript mongodb meteor

目前我有这个发布功能

Meteor.publish('Questions', function(limit, skip) {
  check([limit, skip], [Number]);
  var findAnswers = UserInfo.find({
    userId: this.userId
  }).fetch();

  return Questions.find({}, {
    _id: {
      $not: findAnswers.questionid
    }
  }, {
    skip: skip,
    limit: limit
  });
});

所以基本上有两个集合,问题和用户信息(又名用户答案,嗯,我想我会更改名称),所以在用户信息上我有用户的所有答案。

现在,我当前向用户返回 1x1 问题,这适用于限制(1)和跳过工作,但现在我不想向用户发送他已经回答的问题,我尝试 $不是运算符(operator),但它仍然将问题返回给客户端(用户已经回答的问题)。

这里的$not是正确的运算符吗?这也将是可扩展的?假设将来用户回答 10 个问题,是否需要数组? (保存已回答问题的 ID)。

更新

我现在已经做了类似的东西。

Meteor.publish('Questions', function(limit, skip) {
  check([limit, skip], [Number]);

  var idsArray =[], //Ids array to hold all the current answered questions ids

    findAnswers = UserInfo.find({  //Simple query
      userId: this.userId
    }).fetch();

  _.each(findAnswers, function(id) {
    idsArray.push(id.questionid);  //forEach to push the ids on the query
  });

  return Questions.find({}, {  //Returning only questions
    skip: skip,                                      //with no answers to the client
    limit: limit
  });
});

现在我得到了一个 _ids 数组,我怎样才能发送与查询中的 id 不匹配的文件?

第二次更新

经过一番研究,我发现$nin可以做到这一点,但这似乎不起作用,无论如何,仍然将 3 个文档返回给客户端

这里有更多信息。

这是我的问题查询。

> Questions.find().fetch()
[ { _id: '2eGSTigujteL4X7qG',
    title: 'Where you work?',
    body: 'Tell us about your job' },
  { _id: 'ByiJGwgHTm5dk5CBj',
    title: 'Where did you study?',
    body: 'Tell us about your where did you study' },
  { _id: 'gExyMfiivpb4ZtQTb',
    title: 'Did you have childs?',
    body: 'Tell us about your childs' } ]

现在这是我的idsArray

 [ '2eGSTigujteL4X7qG', 'ByiJGwgHTm5dk5CBj' ]

这就是我在查询中的做法。

  returnQuestions.find({}, {
    _id: {
      $nin: [idsArray] //already try without []
    },                            
    skip: skip,                   
    limit: limit
  });

但这仍然向客户端返回 3 个对象,而不是仅 1 个,这应该只返回带有 _id:"gExyMfiivpb4ZtQTb" 的对象,对吧?我不知道我的错误在哪里。

最佳答案

如果您的最后一个代码片段是代码中的实际复制+粘贴,则您的 find() 语法错误(您将选择器放在选项对象中并将选择器对象留空)。你想要的可能应该是这样的:

returnQuestions.find(
    {
    _id: {
      $nin: idsArray // assuming this already is an Array you of course shouldn't add brackets around it
    }, {                            
    skip: skip,                   
    limit: limit
  });

并且 $nin 确实应该是适合您的情况的正确运算符(您也可以使用不同的方法)。

关于javascript - 根据_id限制发布限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31038968/

相关文章:

meteor - Momentjs 在 meteor react ?

javascript - 如何在JQuery显示/隐藏方法中停止重复div?

javascript - 使用javascript/jquery重命名类属性的前面

JavaScript setTimeout 0 阻塞页面渲染?

mongodb - Azure 数据工厂 - 按日期过滤 Mongodb 源数据集

javascript - Meteor.js 集合未在 mongo 中创建

meteor - 将计算字段添加到发布中的 Meteor.users

javascript - Dojo DataGrid 如何通知 View 服务器上的数据已更改?

node.js - MongoDB、Mongoose 从一个 Find 中搜索另一个集合的结果

mongodb - cloudfoundry 中的 Node.js mongodb-native 驱动认证