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
Word.find().lean().exec(function (err, docs) {
    // docs are plain javascript objects instead of model instances
});
于 2012-09-01T18:30:37.550 回答
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 回答
1

您可以使用 reduce 函数将任何数组“重新索引”到字典中。我在示例中使用了下划线 reduce,但我认为稍微调整一下它就可以直接在 mongoose 中工作。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 回答