use*_*ser 1 mongoose mongodb node.js subdocument embedded-documents
我目前有一个架构,目前看起来像:
var User = new Schema({
id: String,
firstName: String,
lastName: String,
password: String,
username: String,
position: [{
title: String,
location: String,
start: String,
term:Number,
description:String,
date: {type: Date, default: Date.now}
}]
});
Run Code Online (Sandbox Code Playgroud)
我有两个用户,每个用户有两个嵌入式位置文档.
用户1:
"position" : [
{
"title" : "Web Developer",
"location" : "Dublin",
"start" : "May 2017",
"term" : 6,
"description" : " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dsit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi",
"_id" : ObjectId("58d6b7e11e793c9a506ffe0f")
},
{
"description" : "description",
"term" : 12,
"start" : "may 2018",
"location" : "Dublin",
"title" : "Web Developer",
"_id" : ObjectId("58d6af99e4318f4703ceb2af")
}
],
Run Code Online (Sandbox Code Playgroud)
用户2:
"position" : [
{
"title" : "Software Engineer",
"location" : "Cork",
"start" : "May 2017",
"term" : 9,
"description" : " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in miorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi",
"_id" : ObjectId("58d6af99e4318f4703cebsju7")
},
{
"title" : "Web Developer",
"location" : "Waterford",
"start" : "May 2017",
"term" : 6,
"description" : " Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dsit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi",
"_id" : ObjectId("58d6af99e4318f4703ceb6aj")
}
],
Run Code Online (Sandbox Code Playgroud)
我的查询看起来像:
app.post('/search', function (req, res) {
var position = new RegExp(req.body.position, 'i');
User.find({'position.title': position}, 'position.$').exec(function (err, result) {
console.log(result);
res.send({ results: result });
}); //
});
Run Code Online (Sandbox Code Playgroud)
搜索"Web Developer"时,这将返回第一个用户中的第一个"Web Developer"条目,以及第二个用户中的"Web Developer"条目,但我似乎无法返回任何后续条目,我只是想知道它是一个MongoDB问题,我只能返回一个匹配每个用户的子文档?或者我的代码中有什么问题?
返回的对象可以在下面看到,结果对象返回两个用户,每个用户有一个位置对象,但是应该有3个.

假设我在位置数组中有一个数组,我该如何访问它?
我目前的代码:
app.get('/applied', function(req, res){
User.aggregate(
{$unwind : "$position"},
{$unwind : "$position.applied"},
{$match:{'position.applied.candidate_id': "58dc2bd4e7208a3ea143959e"}}).exec(function (err, result) {
console.log(result);
});
res.render('applied', { title: 'applied'});
});
Run Code Online (Sandbox Code Playgroud)
我的架构:
position: [{
title: String,
location: String,
start: String,
term:Number,
description:String,
date: {type: Date, default: Date.now},
applied:[{
candidate_id: String,
name: String
}],
}],
Run Code Online (Sandbox Code Playgroud)
你可以使用$ unwind,它会从集合中获取多个条目,这与元素匹配或'.'不同.只返回第一个匹配数据的运算符
User.aggregate(
{$unwind : "$position"},
{$match:{'position.title': position}}).exec(function (err, result) {
console.log(result);
res.send({ results: result });
});
Run Code Online (Sandbox Code Playgroud)