0

不确定这是否可能,但这里有。

我有一个 MongoDB(使用 morphia 来访问它),它有一个如下表(对于这个例子进行了简化,但概念是相同的):

{name:"Product A", parts:[{sku:"W-01"},{sku:"Y-01", qty:2}]}
{name:"Product B", parts:[{sku:"X-02"},{sku:"W-02"}]}
{name:"Product C", parts:[{sku:"Z-01"}]}

现在我想查找部分 sku 以“Y”或“Z”开头的产品。对于上述文档,应返回第一个和第三个。

我可以想象的一个可能的查询是这样的:

{$or:[{"parts":{"$elemMatch":{sku:/Y.*/}}},{"parts":{"$elemMatch":{sku:/Z.*/}}}]}

这需要遍历查询数组 ["Y","Z"]

有没有其他方法可以做到这一点?:)

4

1 回答 1

1

除了进行正则表达式匹配之外,您还可以将第一个字母拆分为自己的子键:

{
    name:"Product A", 
    parts: [
        { s: "W", ku: "W-01" },
        { s: "Y", ku: "Y-01", qty:2 }
    ]
}

否则你可以简单地做这个正则表达式匹配——你也不需要$elemMatch这里。

db.products.find( { "parts.sku: /^[YZ]/ } );

但是最好对$or它们中的每一个使用一个,因为这样至少可以使用索引的一小部分,因为正则表达式搜索现在是一个固定前缀的正则表达式,它在内部被重写为范围查询 ( Y <= x < Z) 或 ( Z <= x < [):

db.so.ensureIndex( { 'parts.sku': 1 } );
db.products.find( { $or: [
    { "parts.sku": /^Y/ },
    { "parts.sku": /^Z/ } 
] } );
于 2013-08-08T11:08:41.370 回答