4

このスキーマを持つWordモデルがあるとしましょう

var Word = new Schema({
  name: { type: String, required: true },
  disambiguation: String,
  partOfSpeech: { type: ObjectId, ref: "PartOfSpeech", required: true },
  attributes: [{ type: ObjectId, ref: "Attribute"}],
  root: [{ type: ObjectId, ref: "Word"}],
  language: { type: ObjectId, ref: "Language", required: true }
});

単語名をキーとして、値を対応する名前の単語を含むドキュメントの配列として、オブジェクトを返すクエリを実行したいと思います。

例として、これが私が望む種類の出力です。簡潔にするために、ほとんどのフィールドは省略されています。

{
  stick: [{
    _id: "5024216f6df57b2b68834079",
    partOfSpeech: "noun"      
  }, {
    _id: "678451de6da54c2b68837345",
    partOfSpeech: "verb"
  }],
  dog: [{
    _id: "47cc67093475061e3d95369d",
    partOfSpeech: "noun"
  }]
}

このようにして、単語のリストにランダムにアクセスできるので、繰り返し繰り返す必要がありません。マングースでこれを行うための組み込みの方法はありますか?

4

3 に答える 3

2

これを Mongoose で直接行うことはできませんが、クエリの結果をストリーミングすると、目的の連想配列を非常に簡単に構築できます。

var stream = Word.find().stream(), results = {};
stream.on('data', function(doc) {
    if (results.hasOwnProperty(doc.name)) {
        results[doc.name].push(doc);
    } else {
        results[doc.name] = [doc];
    }
}).on('error', function(doc) {
    // Error handling...
}).on('close', function(doc) {
    // All done, results object is ready.
});
于 2012-09-03T00:45:36.090 に答える
2
Word.find().lean().exec(function (err, docs) {
    // docs are plain javascript objects instead of model instances
});
于 2012-09-01T18:30:37.550 に答える
1

reduce 関数を使用して、任意の配列をディクショナリに "再インデックス化" できます。私の例ではアンダースコアリデュースを使用していますが、少し調整するだけでマングースで直接機能すると思います。http://techishard.wordpress.com/2012/04/22/reducing-an-array-of-objects-to-a-hash-using-a-property-as-key/

_.reduce (foo, function (reduced, item) {
 reduced[item.name] = item;
 return reduced;
}, {});
于 2012-10-25T03:43:06.417 に答える