4

我正在尝试结合正则表达式和嵌入式对象查询并且失败得很惨。我要么遇到了 mongodb 的限制,要么只是遇到了一些小问题,也许有人遇到了这个问题。该文档当然不包括这种情况。

被查询的数据:

{
    "_id" : ObjectId("4f94fe633004c1ef4d892314"),
    "productname" : "lightbulb",
    "availability" : [
            {
                    "country" : "USA",
                    "storeCode" : "abc-1234"
            },
            {
                    "country" : "USA",
                    "storeCode" : "xzy-6784"
            },
            {
                    "country" : "USA",
                    "storeCode" : "abc-3454"
            },
            {
                    "country" : "CANADA",
                    "storeCode" : "abc-6845"
            }
    ]
}

假设集合仅包含一条记录

此查询返回 1:

db.testCol.find({"availability":{"country" : "USA","storeCode":"xzy-6784"}}).count();

此查询返回 1:

db.testCol.find({"availability.storeCode":/.*/}).count();

但是,此查询返回 0

db.testCol.find({"availability":{"country" : "USA","storeCode":/.*/}}).count();

有谁明白为什么?这是一个错误吗?

谢谢

4

1 回答 1

3

您错误地引用了嵌入式存储代码 - 您将其作为嵌入式对象引用,而实际上您拥有的是一个对象数组。比较这些结果:

db.testCol.find({"availability.0.storeCode":/x/});
db.testCol.find({"availability.0.storeCode":/a/});

使用上面的示例文档,第一个不会返回,因为第一个 storeCode 中没有 x(“abc-1234”),第二个将返回文档。这对于您正在查看数组的单个元素并传入位置的情况很好。为了搜索数组中的所有对象,您需要$elemMatch

例如,我添加了第二个示例文档:

{
    "_id" : ObjectId("4f94fe633004c1ef4d892315"),
    "productname" : "hammer",
    "availability" : [
            {
                    "country" : "USA",
                    "storeCode" : "abc-1234"
            },

    ]
}

现在,看看这些查询的结果:

PRIMARY> db.testCol.find({"availability" : {$elemMatch : {"storeCode":/a/}}}).count();
2
PRIMARY> db.testCol.find({"availability" : {$elemMatch : {"storeCode":/x/}}}).count();
1
于 2012-05-25T14:16:42.350 回答