2014-05-12 74 views
0

一个成员是一个或多个组的一部分。一个组可以有一个或多个成员。在mongodb中合并查询

给定一个成员和他所在的小组,我怎样才能获得每个小组的其他成员?

var MemberSchema = new Schema(
{ 
    name: { 
     first:  { type: String }, 
     last:  { type: String }, 
    }, 
    groups:  [ { type: String } ], 
    otherMembersInGroups: [ { 
     id: { type: Schema.ObjectId, ref: 'Member' } , 
     name: { 
      first:  { type: String }, 
      last:  { type: String }, 
     } 
    } ], 
}); 

var query = MemberModel.findOne({ _id: objId }); 
query.exec(function(err, member) 
{ 
    // TODO: get all the members in all the groups that this member is in 
    var otherMembersInGroups = magicHere(); 
    member.otherMembersInGroups = otherMembersInGroup; 

    return res.send(200, member); 
} 

我的出发点是

var query = MemberModel.find({ groups: "groupNamesHere" }) 

,但我真的不知道如何将其与上述相结合。

另外:如何正确地将此字段添加到猫鼬模型?我试过了,但是有很多重复(见上)。但似乎没有将它添加到模型中,它实际上并没有添加到成员对象中?

+1

看来“魔法”不见了。但是你的模型是什么样的? “组”是一个数组吗?你想要做什么?在你有一个“成员”后,你是否想要匹配所有其他记录也具有相同的组,如在一些或任何? –

+0

谢谢,我已经将模型的代码添加到了上面。是的,组是一个数组。在我有一个“成员”之后,我想为该成员添加一个字段,该成员包含该成员所在组中的所有其他成员。示例:您位于组x中。以下是所有其他成员谁也在组x。 – Ben

+0

作为查询结果,我假定这意味着,而不是实际上更新整个文档。那是对的吗? –

回答

1

对于我而言,我不会对“Schema”定义如此正式,并对它进行一些不同的处理。考虑架构定义如下:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 

var memberSchema = new Schema({ 

    name: { 
    first: { type: String }, 
    last: { type: String } 
    }, 
    groups: [ { type: String } ] 

}); 

var Member = mongoose.model('Member', memberSchema); 

随着数据是这样的:

{ 
    "_id" : ObjectId("53708c9865a6272f6e26c9bf"), 
    "groups" : [ "tennis" ], 
    "name" : { "first" : "Ted", "last" : "Logan" }, 
    "__v" : 0 
} 
{ 
    "_id" : ObjectId("53708cb33905d7846ee2a218"), 
    "groups" : [ "tennis", "hockey" ], 
    "name" : { "first" : "Bill", "last" : "Preston" }, 
    "__v" : 0 
} 
{ 
    "_id" : ObjectId("53708cd200155f916e9248f6"), 
    "groups" : [ "perl", "hockey" ], 
    "name" : { "first" : "Fozzie", "last" : "Bear" }, 
    "__v" : 0 
} 
{ 
    "_id" : ObjectId("53708ce7c95556e66ee4967f"), 
    "groups" : [ "perl", "hockey" ], 
    "name" : { "first" : "Serena", "last" : "Williams" }, 
    "__v" : 0 
} 

操作的其余部分变成这样:

Member.findOne({ _id: "53708cb33905d7846ee2a218" },function(err,member) { 

    Member.find({ 
    "groups": { "$in": member.groups }, 
    "_id": { "$nin": [ member._id ] } 
    },function(err, others) { 

    var data = { 
     name: member.name, 
     groups: member.groups, 
     otherMembers: [] 
    }; 

    others.forEach(function(other) { 
     var doc = {}; 
     doc.name = other.name; 
     doc._id = other._id; 
     data.otherMembers.push(doc); 
    }); 

    console.log(data); 

    }); 

}); 

当然代替该console.log()部分与实际API函数。但是一般来说,一个原始对象比“模式”操作规则要少,因此控制结果更容易一些。

此外,请确保您有一个索引指定的顺序,其中“组”是第一个元素,以优化这一点。