猫鼬找到多个匹配项
Mongoose find with multiple matches
我是这项技术的新手,正在使用使用 Mongoose 的 Node 和 Express 服务器。我有以下文档集合架构。
var empSchema = new mongoose.Schema({
_id: String,
orgName: {type: String, required: true},
locName: {type: String, required: true},
empName: {type: String, required: true}
});
在这里,我在请求中获得了位置名称列表,例如 "NewYork"、"London"、"Paris" 等...,并且需要 return 中的文档回复如下....
{
result:[{locName:"NewYork",
empList:[
{orgName:"abc", empName:"emp1"},
{orgName:"xyz", empName:"emp2"}]
},
{locName:"London",
empList:[
{orgName:"pkq", empName:"emp13"},
{orgName:"mns", empName:"emp23"}]
}]
}
从 Node.js 使用 mongoose 的最佳方式是什么?我认为对 mongodb 进行多次查询(每个查询都有一个位置)是个坏主意。
有没有办法通过单次调用 mongoose 获得预期的 json 响应?谢谢
所有查询,当您需要按称为聚合的总和值进行分组时。您可以在 mongo docs and same methods have model in Mongoose 中阅读相关信息。要生成您的查询,您可以使用如下代码:
Employee
.aggregate()
.group({ _id: '$locName', empList: { $push: "$$ROOT" }})
.exec(function (err, res) {
});
如果不需要全部查询table,还有match方法
是,使用 aggregation framework to get the desired output. The aggregation pipeline will consist of a $group
operator pipeline stage which groups the documents by the locName
field and the $addToSet
accumulator operator to add the orgName
and empName
fields to an array empList
. The last pipeline stage $project
运算符,然后用新字段 locName
.
替换先前聚合流中的 _id
字段
为了演示这个概念,假设您有一个示例集合,您使用 mongo shell:
插入
db.employees.insert([
{
_id: "1",
orgName: "abc",
locName: "New York",
empName: "emp1"
},
{
_id: "2",
orgName: "xyz",
locName: "New York",
empName: "emp2"
},
{
_id: "3",
orgName: "pkq",
locName: "London",
empName: "emp13"
},
{
_id: "4",
orgName: "mns",
locName: "London",
empName: "emp23"
}
])
以下聚合生成所需的结果:
db.employees.aggregate([
{
"$group": {
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
}
},
{
"$project": {
"_id": 0,
"locName": "$_id",
"empList": 1
}
}
])
输出:
/* 0 */
{
"result" : [
{
"empList" : [
{
"orgName" : "mns",
"empName" : "emp23"
},
{
"orgName" : "pkq",
"empName" : "emp13"
}
],
"locName" : "London"
},
{
"empList" : [
{
"orgName" : "xyz",
"empName" : "emp2"
},
{
"orgName" : "abc",
"empName" : "emp1"
}
],
"locName" : "New York"
}
],
"ok" : 1
}
在 Mongoose 中,您可以像这样使用 aggregation pipeline 构建器:
Employee.aggregate()
.group({
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
})
.project({
"_id": 0,
"locName": "$_id",
"empList": 1
})
.exec(function (err, res) {
if (err) return handleError(err);
console.log(res);
});
// Or the simple aggregate method
var pipeline = [
{
"$group": {
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
}
},
{
"$project": {
"_id": 0,
"locName": "$_id",
"empList": 1
}
}
]
Employee.aggregate(pipeline, function (err, res) {
if (err) return handleError(err);
console.log(res);
});
我是这项技术的新手,正在使用使用 Mongoose 的 Node 和 Express 服务器。我有以下文档集合架构。
var empSchema = new mongoose.Schema({
_id: String,
orgName: {type: String, required: true},
locName: {type: String, required: true},
empName: {type: String, required: true}
});
在这里,我在请求中获得了位置名称列表,例如 "NewYork"、"London"、"Paris" 等...,并且需要 return 中的文档回复如下....
{
result:[{locName:"NewYork",
empList:[
{orgName:"abc", empName:"emp1"},
{orgName:"xyz", empName:"emp2"}]
},
{locName:"London",
empList:[
{orgName:"pkq", empName:"emp13"},
{orgName:"mns", empName:"emp23"}]
}]
}
从 Node.js 使用 mongoose 的最佳方式是什么?我认为对 mongodb 进行多次查询(每个查询都有一个位置)是个坏主意。
有没有办法通过单次调用 mongoose 获得预期的 json 响应?谢谢
所有查询,当您需要按称为聚合的总和值进行分组时。您可以在 mongo docs and same methods have model in Mongoose 中阅读相关信息。要生成您的查询,您可以使用如下代码:
Employee
.aggregate()
.group({ _id: '$locName', empList: { $push: "$$ROOT" }})
.exec(function (err, res) {
});
如果不需要全部查询table,还有match方法
是,使用 aggregation framework to get the desired output. The aggregation pipeline will consist of a $group
operator pipeline stage which groups the documents by the locName
field and the $addToSet
accumulator operator to add the orgName
and empName
fields to an array empList
. The last pipeline stage $project
运算符,然后用新字段 locName
.
_id
字段
为了演示这个概念,假设您有一个示例集合,您使用 mongo shell:
插入db.employees.insert([
{
_id: "1",
orgName: "abc",
locName: "New York",
empName: "emp1"
},
{
_id: "2",
orgName: "xyz",
locName: "New York",
empName: "emp2"
},
{
_id: "3",
orgName: "pkq",
locName: "London",
empName: "emp13"
},
{
_id: "4",
orgName: "mns",
locName: "London",
empName: "emp23"
}
])
以下聚合生成所需的结果:
db.employees.aggregate([
{
"$group": {
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
}
},
{
"$project": {
"_id": 0,
"locName": "$_id",
"empList": 1
}
}
])
输出:
/* 0 */
{
"result" : [
{
"empList" : [
{
"orgName" : "mns",
"empName" : "emp23"
},
{
"orgName" : "pkq",
"empName" : "emp13"
}
],
"locName" : "London"
},
{
"empList" : [
{
"orgName" : "xyz",
"empName" : "emp2"
},
{
"orgName" : "abc",
"empName" : "emp1"
}
],
"locName" : "New York"
}
],
"ok" : 1
}
在 Mongoose 中,您可以像这样使用 aggregation pipeline 构建器:
Employee.aggregate()
.group({
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
})
.project({
"_id": 0,
"locName": "$_id",
"empList": 1
})
.exec(function (err, res) {
if (err) return handleError(err);
console.log(res);
});
// Or the simple aggregate method
var pipeline = [
{
"$group": {
"_id": "$locName",
"empList": {
"$addToSet": {
"orgName": "$orgName",
"empName": "$empName"
}
}
}
},
{
"$project": {
"_id": 0,
"locName": "$_id",
"empList": 1
}
}
]
Employee.aggregate(pipeline, function (err, res) {
if (err) return handleError(err);
console.log(res);
});