2013-03-19 54 views
1

我有一个嵌入文档数组的模型。这是由设计制作的,因为我们经常(几乎总是)查询根文档以及嵌入式文档。在Mongoose ODM中查找嵌入式文档

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 
} 

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

+0

可能重复(http://stackoverflow.com/questions/15117030/how-to [如何与MongoDB的子文档滤波器阵列] -filter-array-in-subdocument-with-mongodb) – JohnnyHK 2013-03-20 13:03:53

+0

@JohnnyHK这是错误的假设。请重新阅读我的问题以及您建议重复的问题。建议的重复问题是关于已经收到结果的“聚合”,这个问题是关于查询的。虽然这个问题如果是通过驱动程序完成的话可以通过聚合来解决,但在我的情况下(请仔细看看问题的标签和文本)解决方案是否需要Mongoose ODM,它对我来说根本不起作用。 – AlexKey 2013-03-21 14:05:53

+0

@JohnnyHK顺便说一句,MongoDB JIRA有一个bug,https://jira.mongodb.org/browse/SERVER-9028因为这是自由和开放源码软件,所以我想一旦获得一点空闲时间,就可以研究这个问题。 – AlexKey 2013-03-21 14:15:16

回答

2

这可以在蒙戈外壳被复制:

> 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:我已经更新您的吉拉SERVER-9028相应

+0

谢谢,这作品的魅力! – AlexKey 2013-04-07 16:05:08

+0

我之前的评论错了。它仍然不能如我所期望的那样工作。它仅从每个根文档返回一个元素。在给定的例子中,请尝试使用正则表达式'/ a/i'这个期望返回'子集'的两个元素,但它只会返回第一个元素。 – AlexKey 2013-04-08 08:56:51

+0

请参阅[documentation](http://docs.mongodb.org/manual/reference/projection/positional/):位置$操作符限制查询结果中包含的字段的内容包含**第一个**匹配元素。 - 要将所有匹配的元素从数组中取出,您必须使用[aggregate()](http://docs.mongodb.org/manual/core/aggregation/) – ronasta 2013-04-08 19:01:55

相关问题