在Mongoose ODM中查找嵌入式文档

时间:2013-03-19 09:48:28

标签: node.js mongodb mongoose

我有一个包含嵌入文档数组的模型。这是由设计完成的,因为我们经常(几乎总是)查询根文档和嵌入式文档。

var SubsetSchema = new mongoose.Schema({
    number: {
        type: Number,
        index: true,
        unique: true,
    },
    name: String,
});

var RootSchema = new mongoose.Schema({
    name: String,
    subsets: [SubsetSchema],
});

mongoose.model('collection', RootSchema);
var Root = module.exports = mongoose.model('collection');

使用以下方法查找单个子集文档不是问题:

Root.findOne({'subsets.number': 3}, {_id: 0, 'subsets.$': 1}, ...);

然而,当我需要找到多个子文档时(在我们的例子中使用正则表达式)似乎不可能:

Root.find({'subsets.name': /regex/i}, {_id: 0, 'subsets.$': 1}, ...);

它出现以下错误:

error: {
    "$err" : "positional operator (subsets.$) requires corresponding field in query specifier",
    "code" : 16352
}

在这种情况下我该怎么办?将Schema拆分为两个集合不是一个选项,因为这会破坏我们在其他更频繁的查询上的性能。

1 个答案:

答案 0 :(得分:3)

这可以在mongo shell中重现:

> db.xx.find().pretty()
{
    "_id" : ObjectId("51610020672afd480ccfb9c4"),
    "name" : "any",
    "subsets" : [
        {
            "number" : 3,
            "name" : "aba"
        },
        {
            "number" : 4,
            "name" : "aka"
        }
    ]
}
> // works as expected:
> db.xx.find({"subsets.number": 3},{_id:0, "subsets.$":1})
{ "subsets" : [ { "number" : 3, "name" : "aba" } ] }
> // does not work
> db.xx.find({"subsets.name": /k/},{_id:0, "subsets.$":1})
error: {
    "$err" : "positional operator (subsets.$) requires corresponding field in query specifier",
    "code" : 16352
}

但这有效!

> db.xx.find({"subsets": {$elemMatch:{name:/k/}}},{_id:0, "subsets.$":1})
{ "subsets" : [ { "number" : 4, "name" : "aka" } ] }

@AlexKey:我已相应地更新了你的Jira SERVER-9028