gpt4 book ai didi

php - Mongodb 多嵌套数组搜索

转载 作者:可可西里 更新时间:2023-11-01 09:51:01 24 4
gpt4 key购买 nike

我的目标是搜索数据userid 1的记录

下面是我的数据

{ "_id" : 2,
"name" : "test",
"data" :[{"_id" : "1","file" : "nic", "userid" : [1,2 ]},
{"_id" : "2","file" : "nic1","userid" : [1 ] },
{"_id" : 3,"file" : "nick2","userid" : [1,2 ]}
]},

{ "_id" : 3,
"name" : "test",
"data" : [{"_id" : "1","file" : "nic","userid" : [1,2 ] },
{"_id" : "2","file" : "nic1", "userid" : [3,2 ] }
]}

输出应该是

{ "_id" : 2,
"name" : "test",
"data" :[{"_id" : "1","file" : "nic", "userid" : [1,2 ]},
{"_id" : "2","file" : "nic1","userid" : [1 ] },
{"_id" : 3,"file" : "nick2","userid" : [1,2 ]}
]},

{ "_id" : 3,
"name" : "test",
"data" : [{"_id" : "1","file" : "nic","userid" : [1,2 ] },
]}

我试过了

$res=$collection->find(array("data.userid" =>array('$in'=>array('52')))); 

返回空值

最佳答案

你需要 .aggregate() 方法来“过滤”任何数组内容,而不是单一匹配,而且基本匹配要简单得多,因为 MongoDB 不关心数据是否在数组中,只要指定的路径是正确的:

db.collection.aggregate([
{ "$match": { "data.userid": 1 } },
{ "$project": {
"data": {
"$setDifference": [
{ "$map": {
"input": "$data",
"as": "el",
"in": {
"$cond": [
{ "$setIsSubset": [ [1], "$$el.userid" ] },
"$$el",
false
]
}
}},
[false]
]
}
}},
{ "$match": { "data.0": { "$exists": true } }}
])

对于 PHP,这表示如下:

$collection->aggregate(array(
array( '$match' => array( "data.userid" => 1 )),
array(
'$project' => array(
'data' => array(
'$setDifference' => array(
array(
'$map' => array(
'input' => '$data',
'as' => 'el',
'in' => array(
'$cond' => array(
array( '$setIsSubset' => array(array(1),'$$el.userid') ),
'$$el',
FALSE
)
)
)
),
array(FALSE)
)
)
)
),
array( '$match' => array( 'data.0' => array( '$exists' => TRUE ) ) )
))

$map 运算符允许检查外部数组的每个元素并将每个元素传递给 $cond 三元运算。这会在“内部”数组上处理 $setIsSubset 操作,以查看它是否实际上包含备用集合中的值之一(在本例中为 [1] )以及 true 进行评估,然后返回元素,否则返回 false

$setDifference 的要点是从修改后的数组中删除那些 false 值,只返回匹配的元素。最后,$exists 测试查看外部数组实际上至少有一个元素,并且由于过滤而不是空的。

返回的文档是符合条件的文档,并且只是也符合指定条件的数组元素。

当然这里的运营商要求你至少有 MongoDB 2.6 作为服务器(现在这是一个相当老的版本并且至少是一个建议的更新)但是如果你仍然有一个较低的版本那么你需要一个传统的方法 $unwind$group:

$collection->aggregate(array(
array( '$match' => array( "data.userid" => 1 )),
array( '$unwind' => '$data' ),
array( '$match' => array( 'data.userid' => 1 )),
array(
'$group' => array(
'_id' => '$_id',
'data' => array( '$push' => '$data' )
)
)
))

关于php - Mongodb 多嵌套数组搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33143234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com