在MongoDB中查询Array中的多个ObjectID

Rol*_*Beh 3 database mongodb nosql

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

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

{ _id: ObjectId("552544fd600135861d9e47d5)", 
  name : "User1",
  teams: [
        "5527a9493ebbe2452666c238",
        "5527b1be3371e3a827fa602c"
    ]
}
Run Code Online (Sandbox Code Playgroud)

这些团队只不过是一个集合:

{ _id: ObjectId("5527a9493ebbe2452666c238"),
  name: "Team 1"
}
{ _id: ObjectId("5527b1be3371e3a827fa602c"),
  name: "Team 2"
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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

谢谢你和罗尔夫

chr*_*dam 7

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

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 } });
Run Code Online (Sandbox Code Playgroud)

输出:

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

/* 1 */
{
    "_id" : ObjectId("5527b1be3371e3a827fa602c"),
    "name" : "Team 2"
}
Run Code Online (Sandbox Code Playgroud)