sql >> Databáze >  >> NoSQL >> MongoDB

Jak vrátit pouze vnořené dokumenty pole ze všech dokumentů

Můžete to udělat pomocí .aggregate() a převážně $unwind provozovatel potrubí:

V moderní MongoDB 3.4 a vyšší můžete použít v tandemu s $replaceRoot

Model.aggregate([
  { "$unwind": "$books" },
  { "$replaceRoot": { "newRoot": "$books" } }
],function(err,results) {

})

V dřívějších verzích zadáváte všechna pole pomocí $project :

Model.aggregate([
  { "$unwind": "$books" },
  { "$project": {
    "_id": "$books._id",
    "pages": "$books.pages",
    "title": "$books.title"
  }}
],function(err,results) {

})

Takže $unwind je to, co používáte k dekonstrukci nebo "denormalizaci" položek pole pro zpracování. Efektivně to vytvoří kopii celého dokumentu pro každého člena pole.

Zbytek úlohy je o vrácení „pouze“ těch polí přítomných v poli.

Není to však příliš moudré. Pokud je vaším záměrem pouze vrátit obsah vložený do pole dokumentu, pak by bylo lepší umístit tento obsah do samostatné kolekce.

Je to mnohem lepší pro výkon, rozdělit všechny dokumenty z kolekce pomocí agregačního rámce, jen vypsat tyto dokumenty pouze z pole.



  1. MongoDB $pull

  2. Agregace MongoDb:Jak mohu seskupit pole-1 na základě jiného pole-2, když mám pole-1 a pole-2?

  3. Mongoose Query pro filtrování pole a naplnění souvisejícího obsahu

  4. Chyba transakce PyMongo:Čísla transakcí jsou povolena pouze u člena sady replik nebo mongo