Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何从嵌入文档的键值类型获取准确的文档结果_Mongodb_Doctrine_Odm - Fatal编程技术网

Mongodb 如何从嵌入文档的键值类型获取准确的文档结果

Mongodb 如何从嵌入文档的键值类型获取准确的文档结果,mongodb,doctrine,odm,Mongodb,Doctrine,Odm,假设我有这种文档结构,属性字段将是嵌入的文档 我已经为attributes.key和attributes.value编制了索引 1------------------------------------------------------------------------------------- { "_id" : ObjectId( "5191d8e5d00560402e000001" ), "attributes" : [ { "key" : "pobox","value

假设我有这种文档结构,属性字段将是嵌入的文档 我已经为attributes.key和attributes.value编制了索引

1-------------------------------------------------------------------------------------
{ 
  "_id" : ObjectId( "5191d8e5d00560402e000001" ),
  "attributes" : [ 
  { "key" : "pobox","value" : "QaKUWo" }, 
  { "key" : "city", "value" : "CBDRip" }, 
  { "key" : "address","value" : "zmycAa" } ],
  "email" : "FWAUdl_2@email.com",
  "firstname" : "FWAUdl_2" 
}
2-------------------------------------------------------------------------------------
{ 
  "_id" : ObjectId( "5191d8e7d00560402e000055" ),
  "attributes" : [ 
    { "key" : "pobox", "value" : "sNFriy" }, 
    { "key" : "city", "value" : "JPdVrI" }, 
    { "key" : "address", "value" : "phOluW" } ],
  "email" : "hqYNWH_86@email.com",
  "firstname" : "hqYNWH_86" 
}
我的问题是,仅基于属性字段进行查询时,如何获取准确的文档

db.app.find({ attributes.key:address , attributes.value:/.*uw.*/i })
查询结果与我预期的不一样,它应该只生成第二个文档,而不生成第一个文档。 我知道我将regex放在attributes.value上,我希望它只检查具有地址值的attributes.key

如果我想过滤另一个键,比如

db.app.find({ attributes.key:address , attributes.value:/.*uw.*/i , attributes.key:city , attributes.value:/.*ri.*/i })
任何意见都会对你们有帮助。
Thx.

我想您需要$elemMatch()


只是做了一点调查,发现了以下问题。下面使用下面提到的索引。您可以在find()上执行explain()以检查更多索引使用详细信息

db.testing.getIndexKeys()
[ { "_id" : 1 }, { "attributes.key" : 1, "attributes.value" : 1 } ]

test:Mongo > db.testing.find({$and : [ { attributes : {$elemMatch : {key : 'address', value : /.*uw.*/i }} }, { attributes : {$elemMatch : {key : 'city', value : /.*ri.*/i }} }] }).pretty()
{
    "_id" : ObjectId("5191d8e7d00560402e000055"),
    "attributes" : [
        {
            "key" : "pobox",
            "value" : "sNFriy"
        },
        {
            "key" : "city",
            "value" : "JPdVrI"
        },
        {
            "key" : "address",
            "value" : "phOluW"
        }
    ],
    "email" : "hqYNWH_86@email.com",
    "firstname" : "hqYNWH_86"
}

$elemMatch运算符是否使用索引?我有一些方法可以解决使用$where操作符的问题,检查属性列表上的所有项,如db.mycollection.find({$where:function(){for(var idx in this.attributes){if(this.attributes[idx].key='address'&&this.attributes[idx].value.match(/.*xl./I)){return true;});但我认为这个方法不会使用索引。要使查询使用索引,索引位于:db.testing.ensureIndex({'attributes.key':1,'attributes.value':1})。还要使用旧的查询集合的样式,即db.testing.find({'attributes.key':“address','attributes.value':“phOluW”)。explain()我大多听说javascript查询通常很慢,现在还不确定。@Khalidadisensdjaja:只是一个小提示,虽然从我之前的评论中我要求您使用旧的查询方式。但这不会导致重复问题,因为您实际上发布了问题,因为这一次它尝试使用索引并进行正确的匹配.db.testing.find({'attributes.key':“address”,'attributes.value':/.*uw.*/i})。explain()@khalidadisendjajaja:很抱歉索引部分db.testing.find({'attributes.key':“address”,'attributes.value':/.*uw.*/i})正在使用索引,但它在最后扫描文档并返回不需要的结果否不能使用常规的查找查询,因为它将搜索另一个键不是“地址”的值对,我的选择是使用$elemMatch或$where运算符,只是好奇$elemMatch查询是否会使用索引的性能(attributes.key,attributes.value)在进程上。是的,我想我也这么做了,我猜这不是一个高性能选项,但它可以工作,顺便说一句:)
db.testing.getIndexKeys()
[ { "_id" : 1 }, { "attributes.key" : 1, "attributes.value" : 1 } ]

test:Mongo > db.testing.find({$and : [ { attributes : {$elemMatch : {key : 'address', value : /.*uw.*/i }} }, { attributes : {$elemMatch : {key : 'city', value : /.*ri.*/i }} }] }).pretty()
{
    "_id" : ObjectId("5191d8e7d00560402e000055"),
    "attributes" : [
        {
            "key" : "pobox",
            "value" : "sNFriy"
        },
        {
            "key" : "city",
            "value" : "JPdVrI"
        },
        {
            "key" : "address",
            "value" : "phOluW"
        }
    ],
    "email" : "hqYNWH_86@email.com",
    "firstname" : "hqYNWH_86"
}