2011-09-12 15 views
66

最近、私はNodejs上のMongooseでMongoDBを使い始めました。

$orの条件と_idフィールドでModel.findメソッドを使用すると、Mongooseが正しく動作しません。

これは動作しません:

User.find({ 
    $or: [ 
    { '_id': param }, 
    { 'name': param }, 
    { 'nickname': param } 
    ] 
}, function(err, docs) { 
    if(!err) res.send(docs); 
}); 

ちなみに私は '_id' の部分を削除した場合、これは動作しません!

User.find({ 
    $or: [ 
    { 'name': param }, 
    { 'nickname': param } 
    ] 
}, function(err, docs) { 
    if(!err) res.send(docs); 
}); 

MongoDBシェルでは、どちらも正常に動作します。

答えて

132

私はグーグルによってそれを解決:

var ObjectId = require('mongoose').Types.ObjectId; 
var objId = new ObjectId((param.length < 12) ? "123456789012" : param); 
// You should make string 'param' as ObjectId type. To avoid exception, 
// the 'param' must consist of more than 12 characters. 

User.find({ $or:[ {'_id':objId}, {'name':param}, {'nickname':param} ]}, 
    function(err,docs){ 
    if(!err) res.send(docs); 
}); 
+13

質問の回答としてマークすることができます。 – fernandopasik

+0

このソリューションが単語で動作する理由を説明できますか?ありがとう –

+0

私のために働いていない – OMGPOP

0

をMongoDBのドキュメントによると:」MongoDBのは$または式にする必要があり、すべての条項、$または式を評価するために索引を使用するために...つまり、インデックスによってサポートされる」

他のフィールドにインデックスを追加すると効果があります。私は同様の問題を抱えており、これで解決しました。

あなたはここで多くを読むことができます:https://docs.mongodb.com/manual/reference/operator/query/or/

1

を私はマングースのクエリビルダ言語を使用するすべての人を懇願し、代わりにコールバックの約束:

User.find().or([{ name: param }, { nickname: param }]) 
    .then(users => { /*logic here*/ }) 
    .catch(error => { /*error logic here*/ }) 

Mongoose Queriesについては、こちらをご覧ください。

関連する問題