Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何填充非相关字段mongoose_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 如何填充非相关字段mongoose

Node.js 如何填充非相关字段mongoose,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,文档角色= { "_id" = "12345", Name = "Developer" }, { "_id" = "67890", Name = "Manager" } 文件员工= { "_id" = "00000", "Name"= "Jack", "Roles"= [{_id:"12345"},{_id:"67890"}] } 我想选择一个角色并列出具有相同角色的所有用户 怎么做 我想买一些像这样的东西 { "_id" = "12345", Nam

文档角色=

{ "_id" = "12345",  
   Name = "Developer"
},

{ "_id" = "67890",  
   Name = "Manager"
}
文件员工=

{ "_id" = "00000",
  "Name"= "Jack",
  "Roles"= [{_id:"12345"},{_id:"67890"}]
}
我想选择一个角色并列出具有相同角色的所有用户 怎么做

我想买一些像这样的东西

{ "_id" = "12345",  
   Name = "Developer"
   Employees = [{"_id":"00000"}]
}
是否可以使用populate来实现这一点?

Mongoose
.populate()
和其他您可能发现的方法不是MongoDB的“join magic”。事实上,他们所做的一切都是在数据库上执行“附加”查询操作,并为您的客户“秘密”合并结果,而不是您自己进行工作

因此,只要您能够处理它,您最好的选择是使用“嵌入”,它将“相关”信息保留在您要将其“配对”到的文档中,例如“角色”:

{
“_id”:“0000”,
“名称”:“开发商”,
“雇员”:[{U id:“12345”,“姓名:”“杰克”}]
}
这很简单,但当然要自行承担费用,处理“嵌入”条目,以及根据“更新”或“阅读”如何使用。这是一个单一的“读取”操作,但“更新”的成本可能更高,因为需要在多个位置和多个文档中更新嵌入的信息

如果您可以“生活”在“参考”中,并承担由此产生的成本,那么您始终可以这样做:

var rolesSchema=Schema({
“name”:字符串,
“emloyes”:[{“type”:Schema.Types.ObjectId,“ref”:“Employee”}]
});
var employeesSchema=Schema({
“name”:字符串,
“角色”:[{“类型”:Schema.Types.ObjectId,“ref”:“角色”}]
});
var Role=mongoose.model('Role',rolesSchema); var Employee=mongoose.model('Employee',employeeSchema)

Role.find({“\u id”:“12345”}).populate(“employees”).exec(函数(err,docs){ //在此处填充“连接”结果 })

这在幕后的作用是有效的(基本JavaScript表示和“充其量”):

var roles=db.role.find({“\u id”:“12345”}).map(函数(doc){
doc.employees=doc.employees.map(函数(雇员){
返回db.employees.find({“\u id”:{“$in”:doc.employees}}).toArray();
})
})
Mongoose的工作原理是使用“模式”定义“知道”对哪个集合执行“其他查询”,然后将“连接”结果返回给您。但它不是一个查询,而是对数据库的多次点击

其他方案可能将引用的集合信息“保留”在文档本身中,而不是依赖“模型代码”来获取该信息。但同样的原则也适用于需要对数据库进行另一次调用并在提供的API中执行某种类型的“合并”的情况

所以一切都取决于你的选择。您要么“嵌入”数据并承担该成本,要么“引用”数据并承担与多个数据库点击相关联的网络“成本”

这里的关键点是“没有什么是免费的”,甚至不是SQL RDBMS执行“连接”的方式,这也有其自身的“成本”,这也是为什么像MongoDB这样的NoSQL解决方案以这种方式进行连接,而“不支持连接”是因为分布式数据系统中涉及的“成本”


这里的主要教训是“做适合您和您的应用程序的事情”,而不仅仅是选择“现在最酷的事情”,而是基本上期望从选择不同的存储解决方案中得到什么。他们都有自己的目的。正如俗话所说,马匹可以参加比赛。

不可以,因为这需要一个mongodb不支持的连接。您必须在应用程序级别执行此操作。感谢您的快速回复。。但是,匹配填充选项有什么用呢?我们不能使用match选项吗?填充中的match选项允许您在填充集合上设置查询条件。您可以得到详细的解释。是否可以对mongo执行SPARQL查询?这在本地是不可能的。