sql >> Database >  >> NoSQL >> MongoDB

Hoe toegang te krijgen tot geneste bestanden met Pick<> typoscript

De map functie is voor arrays, dus ik ga ervan uit dat je products sleutel in uw voorbeeld is een array en geen object.

Ten eerste raad ik u aan om typedefinities voor uw productreactie op de juiste manier te schrijven, als u dat nog niet heeft gedaan

interface IProduct {
  _id: string,
  category: number,
  gender: number,
  title: string,
  description: string,
  price: number,
  imageFileName: string,
  createdAt: string,
  updatedAt: string,
  __v: number
}

interface IResponse {
  _id: string;
  products: IProduct[];
}

Om vervolgens Pick . te krijgen werken aan een enkel product object, kunt u de IResponse interface met behulp van geïndexeerde toegangstypen . U wilt de products eigenschap bij een index omdat het een array is.

/*

Indexed Access Types

type Person = { age: number, name: string }[];
type Age = Person[number]["age"];

*/

type Products = ReadonlyArray<
  Pick<
    IResponse["products"][number],
    "_id" | "gender" | "title" | "description" | "price" | "imageFileName"
  >
>;

Als u iets zou doen als Pick<IResponse["products"], '_id'...> je zou proberen om Pick . te gebruiken om eigenschappen uit een array te extraheren, wat zou resulteren in een fout.

En het enige dat overblijft is om de producten in kaart te brengen van de respons naar de gewenste objectvorm.


// Query your products

const { products }: IResponse = {
  _id: "611e2febb863ce74ac448220",
  products: [
    {
      _id: "6116a9ecc3e98d500c5e523d",
      category: 5,
      gender: 1,
      title: 'sivdosi',
      description: 'oisbdvoi',
      price: 2394,
      imageFileName: 'http://localhost:3000/images/1628875244435-3564.png',
      createdAt: "2021-08-13T17:20:44.472Z",
      updatedAt: "2021-08-13T17:20:44.472Z",
      __v: 0
    }
  ]
}

// Get the desired object

const pickedProducts: Products = products.map(({ _id, gender, title, description, price, imageFileName }) => ({
  _id,
  gender,
  title,
  description,
  price,
  imageFileName
}));

Het eindresultaat ziet er ongeveer als volgt uit

interface IProduct {
  _id: string,
  category: number,
  gender: number,
  title: string,
  description: string,
  price: number,
  imageFileName: string,
  createdAt: string,
  updatedAt: string,
  __v: number
}

interface IResponse {
  _id: string;
  products: IProduct[];
}

type Products = ReadonlyArray<
  Pick<
    IResponse["products"][number],
    "_id" | "gender" | "title" | "description" | "price" | "imageFileName"
  >
>;

// Query your products

const { products }: IResponse = {
  _id: "611e2febb863ce74ac448220",
  products: [
    {
      _id: "6116a9ecc3e98d500c5e523d",
      category: 5,
      gender: 1,
      title: 'sivdosi',
      description: 'oisbdvoi',
      price: 2394,
      imageFileName: 'http://localhost:3000/images/1628875244435-3564.png',
      createdAt: "2021-08-13T17:20:44.472Z",
      updatedAt: "2021-08-13T17:20:44.472Z",
      __v: 0
    }
  ]
}

// Get the desired object

const pickedProducts: Products = products.map(({ _id, gender, title, description, price, imageFileName }) => ({
  _id,
  gender,
  title,
  description,
  price,
  imageFileName
}));



  1. Waarom voegt mangoest altijd een s toe aan het einde van mijn verzamelingsnaam?

  2. Node.js / Mongodb insert callback return undefined

  3. Een bestand lezen van een mongo-shell

  4. MongoDB $setOnInsert