Node.js 如何找到对象';在mongoose中具有属性值的路径?

Node.js 如何找到对象';在mongoose中具有属性值的路径?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想在mongodb数据库中使用名为“task”的对象。一个任务可以有一个或多个任务作为其子任务。我需要找到一个任务,它可能位于层次结构的任何级别,并带有它的_id或其他属性值。在mongoose或mongodb中我怎么做? 我的任务模式如下所示: var mongoose = require('mongoose'); var Project = require(./project.js); var Resource = require(./resource.js);

我想在mongodb数据库中使用名为“task”的对象。一个任务可以有一个或多个任务作为其子任务。我需要找到一个任务,它可能位于层次结构的任何级别,并带有它的_id或其他属性值。在mongoose或mongodb中我怎么做? 我的任务模式如下所示:

    var mongoose = require('mongoose');

    var Project = require(./project.js); 
    var Resource = require(./resource.js); 
    var Group = require(./group.js); 
    var Phase = require(./phase.js); 
    var Objective = require(./objective.js); 
    var Milestone = require(./milestone.js); 
    var Decision_tag = require(./decision_tag.js); 

    var createInfo = require(./plugins/createInfo); 


    var taskSchema = new mongoose.Schema(
      {
        title :{ type : String, unique : true, required : true,  trim :true},
        resources :[{type : mongoose.Schema.Types.ObjectId , ref : 'Resource', required, false}], 
        groups :[{type : mongoose.Schema.Types.ObjectId , ref : 'Group', required, false}], 
        tasks :[{type : mongoose.Schema.Types.ObjectId , ref : 'Task', required, false}], 
        decision_tags :[{type : mongoose.Schema.Types.ObjectId , ref : 'Decision_tag' , required : false}]

      });
    taskSchema.plugin(createInfo);


    module.exports = mongoose.model('Task' , 'taskSchema' , tasks);

使用代码中定义的模式,所有任务都作为“顶级任务”存储在一个集合中。您的层次结构仅作为这些任务之间的引用存在,因此您可以使用所有正常的mongoose查询功能进行查询,以查找您的任务或子任务,例如:

mongoose.model('Task').find({title: 'myTitle'});
剩下的主要问题可能是查找/加载/显示找到的子任务的整个层次结构。也许最好存储对任务父任务的引用,而不是存储子任务。或者两者兼而有之。这实际上取决于您是要针对写入还是读取进行优化。通过存储父任务,可以轻松识别顶级任务(父任务是emtpy)


如果您从未在没有整个层次结构的情况下显示/加载子任务,您也可以使用子文档而不是ObjectId引用,但是查询子任务将非常棘手。

使用代码中定义的模式,您的所有任务都作为“顶级任务”存储在一个集合中。您的层次结构仅作为这些任务之间的引用存在,因此您可以使用所有正常的mongoose查询功能进行查询,以查找您的任务或子任务,例如:

mongoose.model('Task').find({title: 'myTitle'});
剩下的主要问题可能是查找/加载/显示找到的子任务的整个层次结构。也许最好存储对任务父任务的引用,而不是存储子任务。或者两者兼而有之。这实际上取决于您是要针对写入还是读取进行优化。通过存储父任务,可以轻松识别顶级任务(父任务是emtpy)


如果您从未在没有整个层次结构的情况下显示/加载子任务,您也可以使用子文档而不是ObjectId引用,但查询子任务将非常棘手。

任务的子任务深度可达10级,我必须删除或移动具有其_id或其他属性值的子任务。我该怎么做呢?这些只是普通的树数据结构操作,没有什么特别的mongoose/mongo。找一本关于操作树数据结构的书或谷歌。在移动任务时,基本上需要正确更新引用,或者在删除任务时删除所有从属任务。递归算法在这里有帮助,基本的计算机科学。Mongoose无法为您解决这些问题。该任务可以有高达10级的子任务,我必须删除或移动具有_id或其他属性值的子任务。我该怎么做呢?这些只是普通的树数据结构操作,没有什么特别的mongoose/mongo。找一本关于操作树数据结构的书或谷歌。在移动任务时,基本上需要正确更新引用,或者在删除任务时删除所有从属任务。递归算法在这里有帮助,基本的计算机科学。猫鼬并不能为你解决这些问题。