你应该如何通过mongodb(Meteor)中的嵌套数组查询集合?

时间:2014-12-27 14:17:10

标签: mongodb meteor mongodb-query

我不认为这是一个特定于Meteor的问题,而是围绕mongo和构建mongo查询。

如果我有以下结构,

{
  username : someName,
  contacts : [
     {
      userid : asdfae33rtqqxxx,
      name : contactName,
      status : friend
     }
     {
      userid : asdfae33rtqqxxx,
      name : anotherName,
      status : pending
     }
     {
      userid : asdfae33rtqqxxx,
      name : contactName,
      status : blocked
     }
  ]
}

如何将此数组中的值传递到针对users集合的查询中,a)获取此数组中的用户,或b)从具有特定状态的users集合中获取此数组中的所有用户。

如果无法做到这一点,我应该如何调整架构以使这些查询成为可能?

1 个答案:

答案 0 :(得分:1)

此函数将根据联系人数组和可选的必需状态返回Meteor.users光标:

var usersByContacts = function(contacts, requiredStatus) {
  var userIds = _.chain(contacts)
    .map(function(c) {
      if (requiredStatus) {
        if (c.status === requiredStatus)
          return c.userid;
      } else {
        return c.userid;
      }
    })
    .compact()
    .value();

  return Meteor.users.find({_id: {$in: userIds}});
};

你可以像这样使用它:

var users1 = usersByContacts(thing.contacts);
var users2 = usersByContacts(thing.contacts, 'pending');

这假定thing具有您问题中引用的架构。另请注意,如果您发现这是代码中的常见模式,则应考虑将usersByContacts转换为transform