Конвертировать массив в JSON с идентификаторами в качестве индекса (MongoDB / Express) - PullRequest
0 голосов
/ 01 июля 2018

У меня есть user schema в моей базе данных mongodb, которая спасает пользователей. В мангусте я пишу:

const userSchema = new Schema({
  email: { type: String, unique: true, lowercase: true},
  password: String,
  fname: String,
  lname: String,
  articles: [{
    type: Schema.Types.ObjectId,
    ref: "article"
  }]
})

Я сохранил несколько пользователей в эту коллекцию. Когда я запрашиваю свой API для пользователей, я получаю массив объектов User. Вот так:

[
  {
  "first_name": "Bob",
  "_id": "5b36292760afa11b9a216945",
  "email": "user@mail.de",
  "__v": 0
  },
  {
  "first_name": "Lisa",
  "_id": "5bafkjahf123123123123125",
  "email": "lisa@mail.de",
  "__v": 0
  }
]

Это нормальное поведение? И это исходит от монго или экспресс-стороны? Я слышал, что что-то подобное встречается чаще:

{
 "5b36292760afa11b9a216945":{
  "first_name": "Bob",
  "email": "user@mail.de",
  "__v": 0
  },
 "5bafkjahf123123123123125":
  {
  "first_name": "Lisa",
  "email": "lisa@mail.de",
  "__v": 0
  }
}
  • ? Как я могу преобразовать мой массив в этот вид JSON? Есть ли какая-то функциональность в Монго, которая делает это для меня?

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Вы также можете попробовать агрегацию ниже

db.collection.aggregate([
  { "$group": {
    "_id": null,
    "data": {
      "$push": {
        "k": "$_id",
        "v": {
          "first_name": "$first_name",
          "email": "$email"
        }
      }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])

выход

[
  {
    "5b36292760afa11b9a216945": {
      "email": "user@mail.de",
      "first_name": "Bob"
    },
    "5bafkjahf123123123123125": {
      "email": "lisa@mail.de",
      "first_name": "Lisa"
    }
  }
]
0 голосов
/ 01 июля 2018

Я не думаю, что вы можете получить подобный объект от Монго, но нетрудно конвертировать его с Array.reduce().

let returnedValue = [{"first_name": "Bob","_id": "5b36292760afa11b9a216945","email": "user@mail.de","__v": 0},{"first_name": "Lisa","_id": "5bafkjahf123123123123125","email": "lisa@mail.de","__v": 0}]

let result = returnedValue.reduce((a, c) => (a[c._id] = c, a), {})
console.log(result)

Это оставляет _id в исходном объекте, но если вам нужно было войти в функцию уменьшения.

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