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)。我正要把它作为一个答案贴出来,但你抢先了我一步:)