- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试将目录树存储在 mongoDB 中。这是我的架构:
{ "_id" : ObjectId("541ba7f156d876d3f787bc33"), "name" : "file_1.mp3", "length" : 136.6, "kind" : "audio", "parent" : null }
{ "_id" : ObjectId("541ba7f156d876d3f787bc34"), "name" : "file_2.mp3", "length" : 132.0, "kind" : "audio", "parent" : null }
{ "_id" : ObjectId("541ba7f156d876d3f787bc35"), "name" : "file_3.mp3", "length" : 116.8, "kind" : "audio", "parent" : null }
{ "_id" : ObjectId("541ba7f156d876d3f787bc36"), "name" : "file_4.mp3", "length" : 206.7, "kind" : "audio", "parent" : null }
{ "_id" : ObjectId("541ba84456d876d3f787bc37"), "name" : "folder_1", "length" : null, "kind" : "dir", "parent" : null }
{ "_id" : ObjectId("541ba84456d876d3f787bc38"), "name" : "folder_2", "length" : null, "kind" : "dir", "parent" : null }
{ "_id" : ObjectId("541ba84456d876d3f787bc39"), "name" : "folder_3", "length" : null, "kind" : "dir", "parent" : null }
{ "_id" : ObjectId("541ba91656d876d3f787bc3a"), "name" : "subfolder_1", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") }
{ "_id" : ObjectId("541ba91656d876d3f787bc3b"), "name" : "subfolder_2", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") }
{ "_id" : ObjectId("541ba91656d876d3f787bc3c"), "name" : "subfolder_3", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba84456d876d3f787bc37") }
{ "_id" : ObjectId("541ba98056d876d3f787bc3d"), "name" : "subsubfolder_1", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") }
{ "_id" : ObjectId("541ba98056d876d3f787bc3e"), "name" : "subsubfolder_2", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") }
{ "_id" : ObjectId("541ba98056d876d3f787bc3f"), "name" : "subsubfolder_3", "length" : null, "kind" : "dir", "parent" : ObjectId("541ba91656d876d3f787bc3b") }
我想改变这一点,让 children 嵌套在 parent 身上。即:
[
{
"_id" : ObjectId("541ba7f156d876d3f787bc33"),
"name" : "file_1.mp3",
"length" : 136.6,
"kind" : "audio",
"parent" : null
}
{
"_id" : ObjectId("541ba7f156d876d3f787bc34"),
"name" : "file_2.mp3",
"length" : 136.6,
"kind" : "audio",
"parent" : null
}
{
"_id" : ObjectId("541ba7f156d876d3f787bc35"),
"name" : "file_3.mp3",
"length" : 136.6,
"kind" : "audio",
"parent" : null
}
{
"_id" : ObjectId("541ba7f156d876d3f787bc36"),
"name" : "file_4.mp3",
"length" : 136.6,
"kind" : "audio",
"parent" : null
}
{
"_id" : ObjectId("541ba84456d876d3f787bc37"),
"name" : "folder_1",
"length" : null,
"kind" : "dir",
"parent" : null
"children": [
{
"_id" : ObjectId("541ba91656d876d3f787bc3a"),
"name" : "subfolder_1",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba84456d876d3f787bc37")
},
{
"_id" : ObjectId("541ba91656d876d3f787bc3b"),
"name" : "subfolder_2",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba84456d876d3f787bc37")
"children": [
{
"_id" : ObjectId("54198056d876d3f787bc3d"),
"name" : "subsubfolder_1",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba91656d876d3f787bc3b")
}
{
"_id" : ObjectId("541ba98056d876d3f787bc3e"),
"name" : "subsubfolder_2",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba91656d876d3f787bc3b")
}
{
"_id" : ObjectId("541ba98056d876d3f787bc3f"),
"name" : "subsubfolder_3",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba91656d876d3f787bc3b")
}
]
},
{
"_id" : ObjectId("541ba91656d876d3f787bc3c"),
"name" : "subfolder_3",
"length" : null,
"kind" : "dir",
"parent" : ObjectId("541ba84456d876d3f787bc37")
}
]
}
{
"_id" : ObjectId("541ba84456d876d3f787bc38"),
"name" : "folder_2",
"length" : null,
"kind" : "dir",
"parent" : null
}
{
"_id" : ObjectId("541ba84456d876d3f787bc39"),
"name" : "folder_3",
"length" : null,
"kind" : "dir",
"parent" : null
}
这是我用来尝试完成此任务的函数:
getChildren = function(element) {
// find all the entries that have this element as their parent
var results = FileTree.find({'parent': element._id});
// did we find any children?
if (results.count() !== 0) {
// get an array from the mongo cursor
var rArr = results.fetch();
// attach a '.children' object to each of the children
// so that we continue the tree
var children = _.each(rArr, getChildren);
//make this subtree part of the original element
element.children = children;
return element;
}
else { // the element doesn't have any children
element.children = null;
return element;
}
};
我这样调用函数:
id = new Meteor.Collection.ObjectID("541ba84456d876d3f787bc37");
getChildren(FileTree.findOne({'_id': id}));
我的控制台返回这个:
Object { _id: Object, name: "folder_1", length: null, kind: "dir", parent: null, children: undefined }
为什么 child 没有定义?
最佳答案
您想使用 _.map
而不是 _.each
,请参阅 here .
_.map
返回包含迭代函数结果的数组,这是您要分配给 children
参数的结果。 _.each
只是循环遍历你的集合,返回 undefined
。
关于javascript - 基于元素数组中的父属性构建javascript树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938473/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!