Доступ к данным из справочного документа в mongodb - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть пользовательская коллекция, например

{
    "_id" : "xyz@xyz.com",
    "name" : "First Last",
    "permission" : ObjectId("5bf4e199e2a30916d6eaeb8c")
}
{
    "_id" : "abc@xyz.com",
    "name" : "Name Last",
    "permission" : ObjectId("5bf4e199e2a30916d6eaeb8c")
}

разрешение - это поле ссылки, часть разрешения другой коллекции.Сбор разрешений похож на

{
    "_id" : ObjectId("5bf4e199e2a30916d6eaeb8c"),
    "name" : "Admin"
}
{
    "_id" : ObjectId("5548e199e2a30916d6kj7856"),
    "name" : "Super Admin"
}

Я извлекаю данные из коллекции пользователей, используя совокупность, например

    db.user.aggregate([{'$project': {
        '_id' : 1,
        'name' : "$name",
        'permission' : "$permission.name"
        } 
    }])

Я хочу получить содержимое имени из коллекции разрешений.Вывод:

{'name': 'First Last', 'user_company': 'abc', '_id': 'xyz@xyz.com'}
{'name': 'Last Name', 'user_company': 'NEW COMPANY', '_id': 'abc@abc.com'}

Это должно быть похоже на

{'name': 'First Last', 'user_company': 'abc', '_id': 'xyz@xyz.com', permission : "Admin"}
{'name': 'Last Name', 'user_company': 'NEW COMPANY', '_id': 
'abc@abc.com', 'permission' : "Super Admin"
}

Как получить результат?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Если вы собираетесь часто выполнять этот тип запроса, рекомендуется сохранять разрешения непосредственно в коллекции user в виде строки или встроенного массива (если один пользователь сопоставлен с несколькими пользователями), этотаким образом, вам не нужно делать объединение.

В общем, для объединения требуется использование $ lookup .Чтобы достичь того, что вы ищете, вы можете сделать:

db.user.aggregate([
{ $lookup: { from: "permission", localField: "permission", foreignField: "_id", as: "perm" } },
{ $unwind: "$perm"}, 
{ $project: {  '_id' : 1,  'name' : "$name",  'permission' : "$perm.name" }}
])

Этап $unwind необходим для сглаживания «разрешений».Вы можете пропустить это, если не нужно.

0 голосов
/ 06 декабря 2018

Вы можете использовать агрегацию ниже в mongodb 3.6 и выше

db.users.aggregate([
  { "$lookup": {
    "from": "permissions",
    "let": { "permission": "$permission" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$_id", "$$permission"] }}}
    ],
    "as": "permission"
  }},
  { "$addFields": { 
    "permission": { "$arrayElemAt": ["$permission.name", 0] }
  }}
])

Или с версией mongodb до 3.6

db.users.aggregate([
  { "$lookup": {
    "from": "permissions",
    "localField": "permission",
    "foreignField": "_id",
    "as": "permission"
  }},
  { "$addFields": { 
    "permission": { "$arrayElemAt": ["$permission.name", 0] }
  }}
])
...