Как лучше всего подключиться к объектам схемы MongoDb Mongoose, которые используют списки других объектов

Я изучаю типы данных MongoDB и лучший способ использования документов и схем через Mongoose.

Я определил несколько схем для объекта панели навигации, в котором элементы навигации хранятся в виде списка, и каждый элемент определяется схемой с именем свойства, типом, URL-адресом и списком раскрывающихся списков, если они есть ( если тип "выпадающий").

Вот эти схемы:

var navSchema = new Schema({
    id: String,
    items: [Schema.ObjectId]
});

это навигационный объект, а

var navItemSchema = new Schema({
  name: String,
  type: {type: String, default: "link"},
  url: {type: String, default: null},
  dropdowns: {type: [Schema.ObjectId], default: null}
});

- это схема элемента навигации, но каждый элемент навигации потенциально может иметь раскрывающиеся списки, и поэтому раскрывающиеся списки представляют собой список элементов навигации, которые также потенциально могут иметь раскрывающиеся списки. Но в данном случае это делают лишь немногие.

Теперь, чтобы создать данные для этих объектов, мне нужно сделать что-то вроде этого, чтобы создать элемент навигации, например, для «дома».

var home = new navItem({
  name: "home",
  url: "/home"
});

но для элементов с раскрывающимися списками я должен определить все элементы, которые, как я знаю, будут раскрывающимися, прежде чем определять список, который включает эти элементы, а затем определять родительский элемент и использовать список с теми элементами, которые я только что определил. Нравится

    var allAccessories = new navItem({
      name: "all accessories",
      url: "/accessories"
    });

    var cushions = new navItem({
      name: "cushions",
      url: "/accessories#cushions"
    });

    var cupHolders = new navItem({
      name: "cup holders",
      url: "/accessories#cupholders"
    });

  var accessoriesDropdownItems = [
    allAccessories,
    cushions,
    cupHolders
  ];

var accessories = new navItem({
  name: "accessories",
  type: "dropdown",
  dropdowns: accessoriesDropdownItems
});

Итак, я полагаю, я делаю это правильно ..? Моя единственная проблема с этим методом заключается в том, что в моем файле nav.js, где я создаю этот объект / коллекцию mongodb, я должен подумать о том, какие элементы будут использоваться в раскрывающихся списках других элементов, и поэтому я должен теоретически приказать им быть определенным до того, как другие переменные будут определены в документе.

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

Но я в порядке с физическими отступами, чтобы моя работа была организована и отсортирована.

Мой вопрос в том, как мне получить доступ к свойствам объектов в списках других объектов.

Сразу вверху я определяю Nav как просто объект с идентификатором «nav», потому что я не хочу использовать его _id ObjectId, чтобы постоянно ссылаться на него ...? И массив элементов, содержащий объекты navItemsSchema.

Но когда я пытаюсь добраться до этих объектов через оболочку mongo, используя что-то вроде

db.navs.find({items: {$elemMatch: {name:"home"}}})

Или db.navs.find ({items: ObjectId ("58d5d6df0789f718460ff278")}) Или db.navs.find ({items: {"name": "home"}})

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

app.get('/nav', function(req, res) {
  mongoose.model('nav').find(function(err, nav) {
    res.send(nav);
  });
});

Но все, что мне возвращает, - это структура данных с идентификаторами объекта, а не фактические данные объектов.

{"_id":"58d5d6df0789f718460ff287",
"id":"nav","__v":0,
"items":
    ["58d5d6df0789f718460ff278",
    "58d5d6df0789f718460ff279",
    "58d5d6df0789f718460ff286",
    "58d5d6df0789f718460ff281",
    "58d5d6df0789f718460ff282",
    "58d5d6df0789f718460ff283",
    "58d5d6df0789f718460ff284"
    ]
}

Не могли бы вы помочь мне понять, как я достигаю этих иерархий данных с помощью, скажем, db.navs.nav ("nav"). Items.findAll (), и он перечисляет все элементы и их json?

Или это невозможно, и тогда вам нужно перебрать все элементы. Подождите, где хранятся объекты, соответствующие ObjectId в списке элементов?


person lopu    schedule 25.03.2017    source источник


Ответы (1)


Так что я сам в этом разобрался. Я использовал type: [Schema.ObjectId] (т.е. type был списком Schema.ObjectIds), но я не знал, что это автоматически анализирует введенный список объектов, извлекает только их ObjectId и сохраняет их, все, что мне нужно do было создать тип: [] (т.е. просто список), а затем я могу перемещаться по моему объекту навигации просто ... Ой, подождите, по какой-то причине, когда mongoose nav.sa сохраняет мою навигацию, он становится объектом внутри списка. Поэтому, когда я mongoose.model ('nav'). Find (function (err, nav) {}, он дает мне объект навигации, который мне нужно использовать через nav [0] .items [0] .name Или я могу перейти на навигацию = nav [0], но мне жаль, что мне не нужно делать этот шаг? Может быть, есть ответ, но да. В противном случае. Это решение, которое я искал.

person lopu    schedule 25.03.2017