在MongoDB中查询Array中的多个ObjectID

时间:2015-04-10 12:03:49

标签: mongodb database nosql

我的数据库中有一个“用户”集合。用户可以是多个团队的成员。

我使用数组来引用团队ID。

{ _id: ObjectId("552544fd600135861d9e47d5)", 
  name : "User1",
  teams: [
        "5527a9493ebbe2452666c238",
        "5527b1be3371e3a827fa602c"
    ]
}

团队只不过是一个集合:

{ _id: ObjectId("5527a9493ebbe2452666c238"),
  name: "Team 1"
}
{ _id: ObjectId("5527b1be3371e3a827fa602c"),
  name: "Team 2"
}

现在我想获得用户所属的所有团队的名称。

我只是找到了这样查询的方式:

db.teams.find(
   {_id:{$in:
      [ObjectId("5527a9493ebbe2452666c238"),
      ObjectId("5527b1be3371e3a827fa602c")]
   }})

为此,我需要专门为此查询创建一个数组。我宁愿尝试避免这种情况,因为我已经将ID作为字符串格式的数组提供。这样的事情会很棒:

db.teams.find(
   {_id:{$in:  
          ["5527a9493ebbe2452666c238",
          "5527b1be3371e3a827fa602c"]  // Strings here, not ObjectIDs
   }})

但这不起作用。有没有什么方法可以用一组字符串ID查询ObjectID?

谢谢&问候 罗尔夫

1 个答案:

答案 0 :(得分:7)

您可以结合使用mongodb的findOne()find()光标方法以及原生JavaScript map方法,首先获得团队ID特定用户(将是一个字符串数组),然后使用map函数来映射团队' string id的数组到ObjectId的数组,最后使用生成的数组查询teams集合作为 $in 运算符表达式:

var teams = db.users.findOne({"name": "User1"}).teams;
var obj_ids = teams.map(function (item){ return ObjectId(item)});
db.teams.find({ "_id": { "$in": obj_ids } });

<强>输出

/* 0 */
{
    "_id" : ObjectId("5527a9493ebbe2452666c238"),
    "name" : "Team 1"
}

/* 1 */
{
    "_id" : ObjectId("5527b1be3371e3a827fa602c"),
    "name" : "Team 2"
}