Javascript 从mongoose中的多个集合获取数据?
我有两个集合,即订单和员工。我首先使用客户id从某个客户的订单集合中查找所有订单,然后需要使用结果中的字段从员工集合中查找数据。我面临的问题是,我从Orders得到的结果是一个数组,所以我需要使用for循环对其进行迭代,然后在for循环中查找Employee数据。orders的第一部分有效,但第二部分并不总是为0数组值Javascript 从mongoose中的多个集合获取数据?,javascript,node.js,mongodb,asynchronous,mongoose,Javascript,Node.js,Mongodb,Asynchronous,Mongoose,我有两个集合,即订单和员工。我首先使用客户id从某个客户的订单集合中查找所有订单,然后需要使用结果中的字段从员工集合中查找数据。我面临的问题是,我从Orders得到的结果是一个数组,所以我需要使用for循环对其进行迭代,然后在for循环中查找Employee数据。orders的第一部分有效,但第二部分并不总是为0数组值 async.waterfall([ function(callback) { Order.find({ user_id:
async.waterfall([
function(callback) {
Order.find({ user_id: req.body.id}, {sort: { id: -1 }}, function(err, order) {
callback(null, order);
});
},
function(order, callback) {
for(var i = 0; i < order.length; i++) {
Employee.find({id: order[i].id}, 'field', function(err, employee) {
if (employee.length > 0) {
order[i].field = employee[i].field;
}
order[i].id = order[i].otherid;
regs.push(order[i]);
});
callback(null, regs);
}
}], function (err, result) {
res.send(result);
});
async.瀑布([
函数(回调){
查找({user\u id:req.body.id},{sort:{id:-1}}),函数(err,Order){
回调(空,顺序);
});
},
函数(顺序、回调){
对于(变量i=0;i0){
订单[i]。字段=员工[i]。字段;
}
订单[i].id=订单[i].otherid;
注册推送(订单[i]);
});
回调(null,regs);
}
}],函数(错误,结果){
res.send(结果);
});
但结果是:[0],这不是预期的结果。我做错了什么?
还有其他解决方案吗 您可以在mongodb中尝试$lookup。我想这对你有帮助 我有这样的订单收集
{ "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 }
{ "_id" : 3 }
另一个收藏是这样的库存
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
{ "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
{ "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
{ "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
{ "_id" : 5, "sku": null, description: "Incomplete" }
{ "_id" : 6 }
我使用聚合查找所有订单数据,然后我需要使用订单集合字段查找库存数据
db.orders.aggregate([
{
$lookup:
{
from: "inventory", //another collection name
localField: "item", // order collection field
foreignField: "sku", // inventory collection field
as: "inventory_docs"
}
}
])
输出
{
"_id" : 1,
"item" : "abc",
"price" : 12,
"quantity" : 2,
"inventory_docs" : [
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
]
}
{
"_id" : 2,
"item" : "jkl",
"price" : 20,
"quantity" : 1,
"inventory_docs" : [
{ "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 }
]
}
{
"_id" : 3,
"inventory_docs" : [
{ "_id" : 5, "sku" : null, "description" : "Incomplete" },
{ "_id" : 6 }
]
}
您可以在mongodb中尝试$lookup。我想这对你有帮助 我有这样的订单收集
{ "_id" : 1, "item" : "abc", "price" : 12, "quantity" : 2 }
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1 }
{ "_id" : 3 }
另一个收藏是这样的库存
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
{ "_id" : 2, "sku" : "def", description: "product 2", "instock" : 80 }
{ "_id" : 3, "sku" : "ijk", description: "product 3", "instock" : 60 }
{ "_id" : 4, "sku" : "jkl", description: "product 4", "instock" : 70 }
{ "_id" : 5, "sku": null, description: "Incomplete" }
{ "_id" : 6 }
我使用聚合查找所有订单数据,然后我需要使用订单集合字段查找库存数据
db.orders.aggregate([
{
$lookup:
{
from: "inventory", //another collection name
localField: "item", // order collection field
foreignField: "sku", // inventory collection field
as: "inventory_docs"
}
}
])
输出
{
"_id" : 1,
"item" : "abc",
"price" : 12,
"quantity" : 2,
"inventory_docs" : [
{ "_id" : 1, "sku" : "abc", description: "product 1", "instock" : 120 }
]
}
{
"_id" : 2,
"item" : "jkl",
"price" : 20,
"quantity" : 1,
"inventory_docs" : [
{ "_id" : 4, "sku" : "jkl", "description" : "product 4", "instock" : 70 }
]
}
{
"_id" : 3,
"inventory_docs" : [
{ "_id" : 5, "sku" : null, "description" : "Incomplete" },
{ "_id" : 6 }
]
}
在这种情况下,我将使用populate()
。要确定这一点有点棘手,因为您没有在此处发布当前架构,但让我们假设您有如下设置:
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
var orderSchema = new Schema({
user : { type: Schema.ObjectId, ref: 'User' },
employee : {type: Schema.ObjectId, ref: 'Employee' }
/* Other things */
});
mongoose.model('Order', orderSchema);
现在,根据该设置,您可以这样查询:
Order.find({user: new ObjectId(req.body.id)}).sort({id:-1}).populate('employee').exec(function(e, orders){
/* whatever you want to do with the orders, each of which will have the employee data filled in by here */
});
如果只想从员工模型中提取一些字段,可以像.populate('Employee','name')
那样进行。完整文档位于上,在本例中,我将使用populate()
。要确定这一点有点棘手,因为您没有在此处发布当前架构,但让我们假设您有如下设置:
const mongoose = require('mongoose'),
Schema = mongoose.Schema;
var orderSchema = new Schema({
user : { type: Schema.ObjectId, ref: 'User' },
employee : {type: Schema.ObjectId, ref: 'Employee' }
/* Other things */
});
mongoose.model('Order', orderSchema);
现在,根据该设置,您可以这样查询:
Order.find({user: new ObjectId(req.body.id)}).sort({id:-1}).populate('employee').exec(function(e, orders){
/* whatever you want to do with the orders, each of which will have the employee data filled in by here */
});
如果只想从员工模型中提取一些字段,可以像
.populate('Employee','name')
那样进行。完整文档位于Mongoose中的任何东西上?就像我说的,我使用for循环,只需要员工集合中的一个字段,那么您认为聚合和$lookup是正确的方法吗?此外,我自己也添加了一个Id字段,所以我不使用MongoDbya it right提供的默认Id$查找避免了for循环,它在mongodb 3.2 olny中可用。它是mongodb中的最新命令$只有查找才能在另一个集合中找到数据您能帮我实现这是猫鼬吗?我该怎么办?嘿,我可不想带着这个去任何地方!Mongoose中有什么东西吗?就像我说的,我使用for循环,只需要从Employee集合中提取一个字段,那么您认为聚合和$lookup是正确的方法吗?此外,我自己也添加了一个Id字段,所以我不使用MongoDbya it right提供的默认Id$查找避免了for循环,它在mongodb 3.2 olny中可用。它是mongodb中的最新命令$只有查找才能在另一个集合中找到数据您能帮我实现这是猫鼬吗?我该怎么办?嘿,我可不想带着这个去任何地方!