Я изучаю типы данных 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 в списке элементов?