Получить размер в байтах документа в агрегации - PullRequest
1 голос
/ 26 сентября 2019

Я знаю о Object.bsonsize(), но я не уверен, что это сработает в моем случае.Я хочу эффективно выяснить, какие пользователи в моем приложении имеют наибольшее количество данных, и у меня есть конвейер агрегации, который использует $lookup для сбора всех документов пользователя (разбросанных по 3 другим коллекциям) вместе.Затем я хочу, чтобы этап конвейера выглядел примерно так:

$project: {
    "_id": 1,
    "username": 1, 
    "sizeInBytes": {
        $sizeInBytes: ...
    }
}

Я довольно плохо знаком с агрегацией, поэтому на самом деле не уверен, что мне нужно после sizeInBytes, чтобы ссылаться на весь документ, а не просто на свойство.

Похоже, что, возможно, в MongoDB 4.0+ это можно сделать с помощью $toString, а затем $strLenBytes, но я удивлен, что не могу найти встроенный способ сделать это намного более напрямую.(И, к сожалению, я застрял на 3,6 атм)

1 Ответ

1 голос
/ 27 сентября 2019

К сожалению, даже с MongoDB 4.0+ очень сложно рассчитывать размер, как вы и предполагали, можно использовать длину String. открытый запрос в ожидании возможной будущей функции в агрегированном конвейере.

Имея то, что у вас есть, я предлагаю использовать Javascript для результата вашего $lookup результата.

Например, что-то вроде этого;

db.user.aggregate([
  {
    $lookup: {
      from: "doc1",
      localField: "userId",
      foreignField: "userId",
      as: "doc1arr"
    }
  },
  {
    $lookup: {
      from: "doc2",
      localField: "userId",
      foreignField: "userId",
      as: "doc2arr"
    }
  },
  {
    $lookup: {
      from: "doc3",
      localField: "userId",
      foreignField: "userId",
      as: "doc3arr"
    }
  }
]).map(perUserData => ({ userId: perUserData.userId, size: Object.bsonsize(perUserData) }));

выдаст что-то вроде;

[
    {
        "userId" : 1,
        "size" : 250
    },
    {
        "userId" : 2,
        "size" : 350
    }
]

См. Не-js часть на mongoplayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...