Node.js 按子文档进行Mongoose复杂查询

Node.js 按子文档进行Mongoose复杂查询,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我需要找到所有者、经理、或团队成员之一的项目。下面是模式的外观: var project = new mongoose.Schema({ title: { type: String, require: true }, slug: { type: String, require: true }, description: { type: String, require: true }, descriptionHtml: { type: String, require: true }

我需要找到
所有者
经理
、或
团队成员之一的项目。下面是模式的外观:

var project = new mongoose.Schema({
  title: { type: String, require: true },
  slug: { type: String, require: true },
  description: { type: String, require: true },
  descriptionHtml: { type: String, require: true },
  nextVanityId: { type: Number, default: 1 },
  owner: { type: ObjectId, ref: 'Member', require: true },
  teams: [{ type: ObjectId, ref: 'Team' }],
  managers: [{ type: ObjectId, ref: 'Member' }]
};

var team = new mongoose.Schema({
  name: { type: String, require: true },
  slug: { type: String, require: true },
  project:  { type: ObjectId, require: true, ref: 'Project' },
  created: { type: Date, require: true, default: Date.now },
  members: [{ type: ObjectId, default: null, ref: 'Member' }]
};
我的查询方法如下所示:

function findByMember (member, done) {
  var id = member._id;

  Project
    .find()
    .or([
      { owner: id },
      { managers: id },
      { 'teams.members': id }
    ])
    .exec(done);
}

目前,它适用于所有者和管理者,但在查询每个团队的成员集合时,我是空白的。我应该使用什么?

为了使查询有效,您可以用两种方法解决问题

解决方案1 将您的团队作为嵌入项目的文档:

var team = new mongoose.Schema({
  name: { type: String, require: true },
  slug: { type: String, require: true },
  project:  { type: ObjectId, require: true, ref: 'Project' },
  created: { type: Date, require: true, default: Date.now },
  members: [{ type: ObjectId, default: null, ref: 'Member' }]
};

var project = new mongoose.Schema({
  title: { type: String, require: true },
  slug: { type: String, require: true },
  description: { type: String, require: true },
  descriptionHtml: { type: String, require: true },
  nextVanityId: { type: Number, default: 1 },
  owner: { type: ObjectId, ref: 'Member', require: true },
  teams: [team],
  managers: [{ type: ObjectId, ref: 'Member' }]
};
这样,您的项目文档将包含团队信息和
团队。成员
才有意义

解决方案2 对您的
团队
数据进行非规范化,以便只嵌入相关信息:

var team = new mongoose.Schema({
  name: { type: String, require: true },
  slug: { type: String, require: true },
  project:  { type: ObjectId, require: true, ref: 'Project' },
  created: { type: Date, require: true, default: Date.now },
  members: [{ type: ObjectId, default: null, ref: 'Member' }]
};

var project = new mongoose.Schema({
  title: { type: String, require: true },
  slug: { type: String, require: true },
  description: { type: String, require: true },
  descriptionHtml: { type: String, require: true },
  nextVanityId: { type: Number, default: 1 },
  owner: { type: ObjectId, ref: 'Member', require: true },
  teams: [{
    _id: { type: ObjectId, ref: 'Team' },
    members: [{ type: ObjectId, default: null, ref: 'Member' }]
  }],
  managers: [{ type: ObjectId, ref: 'Member' }]
};

在第二种方法中,您需要保持
Team
文档和非规范化数据同步。

您正在搜索不存在的
Product.teams.members
。您的意思是要搜索(sudo)
还是:[“Project.owner”、“Project.managers”、“Team.members”]
?Nico您的
团队
属性只是对另一个文档的引用。在执行查询时,mongo不知道
teams
具有
members
属性。要进行查询,您需要将
团队
创建为嵌入文档。对不起,我错过了第一句话。。。在当前设置中,您需要通过
成员:id
查询
团队
,然后通过
或:[{owner:id},{managers:id},{teams:teamQueryResponse.\u id}]
查询
项目
。谢谢,这正是我所做的(解决方案1)。我正要把它作为一个答案贴出来,但你抢先了我一步:)