在mongodb查询中结合正则表达式和嵌入对象

我正在尝试结合正则表达式和嵌入式对象查询并惨遭失败.我要么受到
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();

有谁理解为什么?这是一个错误吗?

谢谢

最佳答案 您正在错误地引用嵌入式商店代码 – 您将其作为嵌入对象引用,而实际上您拥有的是对象数组.比较这些结果:

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

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

作为一个例子,我添加了第二个示例doc:

{
    "_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
点赞