我得到了所有带有 populate mongoose 的文档
I get all all docs with populate mongoose
我正在尝试使用 mongodb 进行填充查询(使用 mongoose 作为 orm),但它无法 100% 工作。我的意思是我从应用填充的文档中获取所有条目... ALL,(在交叉文档上)与匹配查询匹配的条目(并且我获得了一个嵌套对象),但我也得到了其他条目(并且嵌套对象为空)。
这是我所做的:
型号
var userSchema = Schema({
name: String,
email: String,
idiom: String
});
var ticketsSchema = Shema({
user_id:{ type:Schema.Types.ObjectId, ref:'User', required: true},
date: Date,
points: Number,
kart: String
});
填充
tickets.find()
.populate(
{
path: 'user_id',
match:{name:"user1"}
}
).exec(function (err, result) {
if (err) return handleError(err);
res.send(result);
});
可能的结果可能是:
Object[0]
__v: 0
_id: "5655b68ccbe953bc2a78da54"
date: "2015-11-25T13:24:28.561Z"
date: "2015-11-25T13:24:28.561Z"
points: 50
kart: "Senior"
user_id: Object
__v: 0
_company: 0
_id: "5655b656cbe953bc2a78da53"
name: "user1"
email: "user1@mail.com"
idiom: "es"
Object[1]
__v: 0
_id: "5655b732e0685c441fddb99b"
date: "2015-11-25T13:27:14.608Z"
points: 75
kart: "Pro Senior"
user_id: Object
__v: 0
_company: 0
_id: "5655b656cbe953bc2a78da53"
name: "user1"
email: "user1@mail.com"
idiom: "es"
Object[2]
__v: 0
_id: "56564613701da2981aa017d6"
date: "2015-11-25T23:36:51.774Z"
points: 75
kart: "Pro Senior"
user_id: null
Object[3]
__v: 0
_id: "565646ee701da2981aa017d8"
date: "2015-11-25T23:40:30.308Z"
points: 75
kart: "Pro Senior"
user_id: null
这不是我想要做的...我希望最后两个不要出现。
编辑
我想我没有解释清楚自己...我想做的是 JOIN 查询...
我已经看到我需要使用 mapreduce,我尝试这样做但是我没有找到一个地方来解释它......傻瓜。到目前为止我能做的就是:
ticketsDB.find()
.populate(
{
path: 'user_id',
match:req.body
}
).exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
console.log(reslt);
res.send(reslt);
});
谢谢。
感谢@JohnnyHK 的评论,我在这里找到了解决方案:Mongoose nested query on Model by field of its referenced model
现在代码是这样的:
usersDB.find(req.body, function(err, docs) {
var ids = docs.map(function(doc) { return doc._id; });
ticketsDB.find({user_id: {$in: ids}})
.populate('user_id').exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
res.send(reslt);
});
});
其中 req.body 是 {name:"user 1"} 或 {email:"user1@user.com"}。
编辑
我在想一点(抱歉,不会再发生 ;p ),我认为有一种方法可以删除此查询的映射。现在我的回答是:
usersDB.find(req.body).distinct("_id", function(err, docs) {
ticketsDB.find({user_id: {$in: docs}})
.populate('user_id').exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
res.send(reslt);
});
});
可能有效吗??
我正在尝试使用 mongodb 进行填充查询(使用 mongoose 作为 orm),但它无法 100% 工作。我的意思是我从应用填充的文档中获取所有条目... ALL,(在交叉文档上)与匹配查询匹配的条目(并且我获得了一个嵌套对象),但我也得到了其他条目(并且嵌套对象为空)。
这是我所做的:
型号
var userSchema = Schema({
name: String,
email: String,
idiom: String
});
var ticketsSchema = Shema({
user_id:{ type:Schema.Types.ObjectId, ref:'User', required: true},
date: Date,
points: Number,
kart: String
});
填充
tickets.find()
.populate(
{
path: 'user_id',
match:{name:"user1"}
}
).exec(function (err, result) {
if (err) return handleError(err);
res.send(result);
});
可能的结果可能是:
Object[0]
__v: 0
_id: "5655b68ccbe953bc2a78da54"
date: "2015-11-25T13:24:28.561Z"
date: "2015-11-25T13:24:28.561Z"
points: 50
kart: "Senior"
user_id: Object
__v: 0
_company: 0
_id: "5655b656cbe953bc2a78da53"
name: "user1"
email: "user1@mail.com"
idiom: "es"
Object[1]
__v: 0
_id: "5655b732e0685c441fddb99b"
date: "2015-11-25T13:27:14.608Z"
points: 75
kart: "Pro Senior"
user_id: Object
__v: 0
_company: 0
_id: "5655b656cbe953bc2a78da53"
name: "user1"
email: "user1@mail.com"
idiom: "es"
Object[2]
__v: 0
_id: "56564613701da2981aa017d6"
date: "2015-11-25T23:36:51.774Z"
points: 75
kart: "Pro Senior"
user_id: null
Object[3]
__v: 0
_id: "565646ee701da2981aa017d8"
date: "2015-11-25T23:40:30.308Z"
points: 75
kart: "Pro Senior"
user_id: null
这不是我想要做的...我希望最后两个不要出现。
编辑
我想我没有解释清楚自己...我想做的是 JOIN 查询...
我已经看到我需要使用 mapreduce,我尝试这样做但是我没有找到一个地方来解释它......傻瓜。到目前为止我能做的就是:
ticketsDB.find()
.populate(
{
path: 'user_id',
match:req.body
}
).exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
console.log(reslt);
res.send(reslt);
});
谢谢。
感谢@JohnnyHK 的评论,我在这里找到了解决方案:Mongoose nested query on Model by field of its referenced model
现在代码是这样的:
usersDB.find(req.body, function(err, docs) {
var ids = docs.map(function(doc) { return doc._id; });
ticketsDB.find({user_id: {$in: ids}})
.populate('user_id').exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
res.send(reslt);
});
});
其中 req.body 是 {name:"user 1"} 或 {email:"user1@user.com"}。
编辑
我在想一点(抱歉,不会再发生 ;p ),我认为有一种方法可以删除此查询的映射。现在我的回答是:
usersDB.find(req.body).distinct("_id", function(err, docs) {
ticketsDB.find({user_id: {$in: docs}})
.populate('user_id').exec(function (err, result) {
if (err) return res.send(err);
reslt=[];
for(var i in result)
if(result[i].user_id)reslt.push(result[i]);
res.send(reslt);
});
});
可能有效吗??