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