MongoDB中的条件$ lookup?

时间:2018-12-10 17:58:09

标签: mongodb mongodb-query aggregation-framework

我在MongoDB 3.6中有两个集合:

users: [
  {name: "John", allowedRoles: [1, 2, 3]},
  {name: "Charles", allowedRoles: [1]},
  {name: "Sarah", isAdmin: true}
]

roles: [
  {_id: 1, name: "Foo", description: "This role allows to foo the blargs"},
  {_id: 2, name: "Bar", description: "..."},
  {_id: 3, name: "Doh", descripcion: "..."}
]

我是MongoDB的新手。我只是想出了如何使用$lookup聚合阶段来查询用户并 join 从他的角色中获取所有数据:

db.users.aggregate([{
  "$match": { "name": "John" }          // Or without this $match part, to get all users
},{                                     //
  "$lookup": {
    "from": "roles",
    "localField": "allowedRoles",
    "foreignField": "_id",
    "as": "roles"
  }
}]);

它适用于我的普通用户,这些用户具有一系列允许的角色ID。我还有管理员用户,可以访问所有现有角色,但没有allowedRoles数组(这将是一个负担,因为会频繁创建新角色)。因此,我没有指定连接字段,而是使用空管道执行$lookup,以获取两个集合的笛卡尔积:

db.users.aggregate([{
  "$match": { "name": "Sarah" }
},{
  "$lookup": {
    "from": "roles",
    "pipeline": [],
    "as": "roles"
  }
}]);

通过单个查询,是否可以同时拥有这两个条件?使用条件表达式或类似内容?

在SQL数据库中,我只需在连接中包括条件:

select users.*, roles.*
from users
left join users_x_roles inter on users.id = inter.user_id
left join roles on inter.role_id = roles.id or users.is_admin = 1;
--                                          ^^^^^^^^^^^^^^^^^^^^^

1 个答案:

答案 0 :(得分:1)

您可以使用以下汇总

$expr允许您在其中使用聚合运算符。因此,对于拥有allowedRoles和没有db.users.aggregate([ { "$match": { "name": "Charles" }}, { "$lookup": { "from": "roles", "let": { "ar": "$allowedRoles" }, "pipeline": [ { "$match": { "$expr": { "$cond": [ { "$eq": [{ "$type": "$$ar" }, "missing"] }, {}, { "$in": ["$_id", "$$ar"] } ] } }} ], "as": "roles" }} ]) 的用户,您可以轻松地使用$cond聚合

<?php
  $d = strtotime("-1 Months");
  echo date("Y-m-d h:i:sa", $d);
?>