如何最好地接触到使用其他对象列表的 MongoDb Mongoose Schema 对象

How to best reach into MongoDb Mongoose Schema objects which use lists of other objects

我正在学习 MongoDB 数据类型以及通过 Mongoose 使用文档和架构的最佳方式。

我已经为将导航项存储为列表的导航栏对象定义了几个模式,每个项目都由具有属性名称、类型、url 和下拉列表(如果有的话)(如果类型是 "dropdown")。

这是这些模式:

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}
});

是导航项架构,但每个导航项都可能有下拉菜单,因此下拉列表是导航项列表,也可能有下拉菜单。但在这种情况下,只有少数人这样做。

现在要为这些对象创建数据,我必须像这样创建一个导航项,例如 "home"

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
});

所以,我想我做对了..?我对这种方法的唯一抱怨是,在我创建此 mongodb object/collection 的 nav.js 文件中,我必须考虑哪些项目将用于其他项目的下拉列表中,所以我必须在理论上命令它们在文档中定义其他变量之前定义。

但是如果我想在两个下拉列表中使用一个项目,而其中一个下拉列表我碰巧已经在文档的上方定义但现在想添加到。我必须将项目定义移到上面使用它的任何地方,这会破坏文档的组织..

但我同意物理缩进以保持我的工作井然有序。

我的问题是如何实际访问其他对象列表中对象的属性。

直截了当,我将 Nav 简单地定义为一个带有 id 的对象,"nav" 因为我不想一直使用它的 _id ObjectId 来引用它...?以及一个包含 navItemsSchema 对象的项目数组。

但是当我尝试通过 mongo shell 使用类似

的东西进入这些对象时
db.navs.find({items: {$elemMatch: {name:"home"}}})

或者 db.navs.find({items: ObjectId("58d5d6df0789f718460ff278")}) 要么 db.navs.find({项目:{ "name" : "home"}})

我无法取回任何数据。我已经通过节点应用程序通过响应在导航中找到的导航成功地return集合中的所有对象

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

但是所有这些 returns me 是一个具有对象 ID 的数据结构,而不是对象的实际数据。

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

你能帮我理解我是如何通过说 db.navs.nav("nav").items.findAll() 进入这些数据层次结构的吗,它列出了所有项目及其 json?

或者这是不可能的,那么您需要遍历所有项目。等等,items列表中ObjectId对应的对象存储在哪里?

所以我实际上自己弄明白了。我正在使用 type: [Schema.ObjectId] (即 type 是 Schema.ObjectIds 的列表)但我不知道它会自动解析输入的对象列表并仅提取它们的 ObjectId 并存储它们,我需要做的就是创建类型:[](即只是一个列表)然后我可以简单地通过...遍历我的导航对象哦等等,由于某种原因当猫鼬 nav.saves 我的导航变成列表中的对象。所以当我 mongoose.model('nav').find(function(err, nav) {} 它给了我一个导航对象,我需要通过 nav[0].items[0].name 或我可以去 nav = nav[0] 但我希望我不需要执行此步骤?也许有答案但是是的。否则。这就是我正在寻找的解决方案。