Составление сводного списка MongoDB по значению массивов - PullRequest
0 голосов
/ 09 июля 2020

Как он делает порядок листинга по значению массива записей с подзапросом Я хочу, чтобы лучший запрос для выполнения в моделях mon go side . js

new ms.Schema({
        name : {type: String,required: true,unique:true},
        display_name: {type: String,required: true,unique:true},
        url: {type: String,default:'' },
        icon: {type: String,default :'no.png' },
        assets : {type:Array,default : ['BTCUSDT']},
        active: {type: Boolean, default : true},
    })

запись mongodb находится здесь

{
    "_id" : ObjectId("5e9e78c477b1c7a1bfc4978c"),
    "url" : "https://bitso.com/",
    "active" : false,
    "name" : "bitso",
    "display_name" : "Bitso",
    "icon" : "Bitso.png",
    "__v" : 0,
    "seq" : 888,
    "assets" : [
        "BTCUSDT",
        "ETHUSDT",
        "LTCUSDT"
    ]
},
{
    "_id" : ObjectId("5e9e78c377b1c7a1bfc4978a"),
    "url" : "https://www.fybsg.com/",
    "active" : false,
    "name" : "fybsg",
    "display_name" : "FYB-SG",
    "icon" : "FYB-SG.png",
    "__v" : 0,
    "seq" : 888,
    "assets" : [
        "BTCUSDT",
        "ETHUSDT"
    ]
},
{
    "_id" : ObjectId("5e9e78c377b1c7a1bfc49789"),
    "url" : "https://hitbtc.com/",
    "active" : true,
    "name" : "hitbtc",
    "display_name" : "Hitbtc",
    "icon" : "Hitbtc.png",
    "__v" : 0,
    "seq" : 99,
    "assets" : [
        "BCCUSDT"
    ]
},
{
    "_id" : ObjectId("5e9e78c077b1c7a1bfc49787"),
    "url" : "https://blockchain.io/",
    "active" : false,
    "name" : "blockchainio",
    "display_name" : "Blockchain.io",
    "icon" : "Blockchain.io.png",
    "__v" : 0,
    "seq" : 999,
    "assets" : [
        "BTCUSDT",
        "ETHUSDT"
    ]
},

db.markets.aggregate ([...])

если возможно Как я могу экспортировать результат, как здесь, из записей mon go; Другой алгоритм, который я должен использовать

Мне нужны такие данные

[
BTCUSDT : { which record assets have BTCUSDT listings },
ETHUSDT : { which record assets have BTCUSDT  listings},  
...

]

1 Ответ

1 голос
/ 11 июля 2020

Вам нужно собрать массив assets каждого do c, используя этап $unwind, а после этого просто сгруппировать их по этому полю:

db.markets.aggregate([
  {
    $unwind: "$assets"
  },
  {
    $group: {
      _id: "$assets",
      recordId: {
        $push: "$_id"
      }
    }
  }
])

Результат будет:

[
  {
    "_id": "BCCUSDT",
    "recordId": [
      "5e9e78c377b1c7a1bfc49789"
    ]
  },
  {
    "_id": "BTCUSDT",
    "recordId": [
      "5e9e78c477b1c7a1bfc4978c",
      "5e9e78c377b1c7a1bfc4978a",
      "5e9e78c077b1c7a1bfc49787"
    ]
  },
  {
    "_id": "LTCUSDT",
    "recordId": [
      "5e9e78c477b1c7a1bfc4978c"
    ]
  },
  {
    "_id": "ETHUSDT",
    "recordId": [
      "5e9e78c477b1c7a1bfc4978c",
      "5e9e78c377b1c7a1bfc4978a",
      "5e9e78c077b1c7a1bfc49787"
    ]
  }
]

Если вам удобнее получить в результате только один объект, вы можете дополнительно сгруппировать их по null id, сохранить все документы в массиве со свойствами k, v и заменить root одного документа:

  {
    $group: {
      _id: null,
      result: {
        $push: {
          k: "$_id",
          v: "$recordId"
        }
      }
    }
  },
  {
    $addFields: {
      result: {
        $arrayToObject: "$result"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$result"
    }
  }

Результат для всего запроса будет:

[
  {
    "BCCUSDT": [
      "5e9e78c377b1c7a1bfc49789"
    ],
    "BTCUSDT": [
      "5e9e78c477b1c7a1bfc4978c",
      "5e9e78c377b1c7a1bfc4978a",
      "5e9e78c077b1c7a1bfc49787"
    ],
    "ETHUSDT": [
      "5e9e78c477b1c7a1bfc4978c",
      "5e9e78c377b1c7a1bfc4978a",
      "5e9e78c077b1c7a1bfc49787"
    ],
    "LTCUSDT": [
      "5e9e78c477b1c7a1bfc4978c"
    ]
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...