1

mongodb (orm として mongoose を使用) で入力クエリを作成しようとしていますが、100% は機能しません。populate を適用するドキュメントからすべてのエントリを取得することを意味します... ALL、(交差したドキュメントで) 一致クエリと一致するエントリ (およびネストされたオブジェクトを取得する) ですが、他のエントリも取得します(そしてネストされたオブジェクトは null です)。

これは私がやったことです:
モデル

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

これはまさに私がやりたいことではありません...最後の2つは表示されないようにしたいと思います。

編集

私は自分自身を明確に説明していなかったと思います...私がやりたいのは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);
    });

ありがとうございました。

4

1 に答える 1

0

@JohnnyHK のコメントに感謝します。ここで解決策を見つけました:参照モデルのフィールドによるモデルの Mongoose ネストされたクエリ

そして今、コードは次のようなものです:

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

それは有効でしょうか??

于 2015-11-30T08:24:08.567 に答える