【问题标题】:Combining queries in mongodb在 mongodb 中组合查询
【发布时间】:2014-05-12 17:14:40
【问题描述】:

一个成员是一个或多个组的一部分。一个组可以有一个或多个成员。

给定一个成员,以及他所在的组,我如何获得每个组中的其他成员?

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" } )

但我不太明白如何将它与上述结合起来。

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

【问题讨论】:

  • 似乎缺少了“魔法”。但是你的模型是什么样的? “组”是一个数组吗?你到底想做什么?拥有一个“成员”后,您是否只想匹配所有其他也具有相同组的记录,例如 some 或 any?
  • 谢谢,我已将模型代码添加到上面。是的,groups 是一个数组。在我拥有一个“成员”之后,我想向该成员添加一个字段,其中包含该成员所在组中的所有其他成员。示例:您在组 x 中。这是组 x 中的所有其他成员。
  • 作为查询结果,我认为这意味着,而不是实际更新整个文档。对吗?
  • 向对象添加字段应该发生在将数据发送到客户端之前,是的。

标签: node.js mongodb express mongoose


【解决方案1】:

对于我来说,我不会对“架构”定义如此正式,并且会稍微不同地处理它。考虑如下定义的架构:

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 );

  });

});

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

还要确保您有一个按该顺序指定的索引,其中“组”是第一个元素,以便优化它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 2021-05-27
    • 1970-01-01
    • 2019-06-18
    • 2019-06-05
    • 2020-07-27
    相关资源
    最近更新 更多