【问题标题】:I get all all docs with populate mongoose我得到所有带有填充猫鼬的文档
【发布时间】:2016-03-03 02:05:41
【问题描述】:

我正在尝试使用 mongodb(使用 mongoose 作为 orm)进行填充查询,但它不能 100% 工作。我的意思是我从应用填充的文档中获取所有条目......所有,(在交叉文档上)与匹配查询匹配的条目(并且我获得一个嵌套对象),但我也得到其他条目(并且嵌套对象为空)。

这就是我所做的:
模型

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);
    });

谢谢。

【问题讨论】:

  • @ma08 感谢您的评论...我认为我根本没有解释清楚,我的问题不是 user_id 在票务集合的某些条目上可能为空(user_id 是需要字段)。我正在尝试做的是用户和票证之间的 JOIN 查询。
  • 嗨@JohnnyHK,我的情况缺少一些东西......这个答案的问题是我没有从用户那里获取数据,我的意思是,user_id 字段只是 id ,而不是包含每个用户的所有信息的对象。
  • 您仍然可以在已删除答案中的 ticketsDB 查询中调用 populate('user_id') 来执行此操作:ticketsDB.find({user_id: {$in: ids}}).populate('user_id').exec(...);

标签: node.js mongodb mongoose mongoose-populate


【解决方案1】:

感谢@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);
    });
});

这可能有效吗??

【讨论】:

    猜你喜欢
    • 2021-02-11
    • 2021-03-22
    • 2015-11-27
    • 2017-05-07
    • 2021-04-26
    • 2013-10-05
    • 2021-10-07
    • 2016-08-17
    • 2021-08-29
    相关资源
    最近更新 更多