gpt4 book ai didi

php - MongoDB 搜索的用户输入

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

我目前正在尝试接受用户输入,以便用户可以搜索数据库。

> db.test2.find().pretty()
{
"_id" : ObjectId("55de8a17f8389e208a1e7d7e"),
"name" : "john",
"favorites" : {
"vegetable" : "spinach",
"fruit" : "apple",
}
}
{
"_id" : ObjectId("55de8a17f8389e208a1f6gg4"),
"name" : "becky",
"favorites" : {
"vegetable" : "spinach",
"fruit" : "apple",
}
}
{
"_id" : ObjectId("55e3b6cbec2740181355b809"),
"name" : "liz",
"favorites" : {
"vegetable" : "spinach",
"fruit" : "banana",
}
}

在此示例中,用户将能够搜索一个人最喜欢的蔬菜、水果或他们最喜欢的蔬菜和水果的任意组合。如果用户输入菠菜作为最喜欢的蔬菜,则将返回所有三个。但是,如果用户输入最喜欢的蔬菜 = 菠菜和最喜欢的水果 = 苹果,则只会返回 john 和 becky。

在 MongoDB 中,您可以确定要搜索的参数。我正在尝试以一种方式编写我的代码,如果用户将字段留空,则不应搜索它。

我试过了

$query = array("favorites.vegetable" => "$userInput", "favorites.fruit" => "$userInput2");

但如果这些字段中的任何一个留空,它将不会返回任何结果。我考虑过尝试使用 if 语句:

if ($vegetable == NULL)
{
$query = array("favorites.fruit" => "$fruit");
}

else if($fruit == NULL)
{
$query = array("favorites.vegetable" => "$vegetable");
}

else
{
$query = array("favorites.vegetable" => "$vegetable", "favorites.fruit" => "$fruit");
}

但是如果我想让我的数据库可以通过更多参数进行搜索,我就会有太多的条件语句。有什么方法可以让我的 Mongo 搜索在字段留空时识别出来吗?

最佳答案

真正的问题是,“输入来自哪里?”。就好像您对输入有某种结构,那么编码就很容易遵循一种模式。

实际上,使用两个基本变量,您可以清理代码以根据变量中的内容简单地构造您的查询:

$query = array();

if ( $fruit != NULL ) {
$query["favorites.fruit"] = $fruit;
}

if ( $vegetable != NULL ) {
$query["favorites.vegetable"] = $vegetable;
)

这意味着您要么在这里得到一个 $query,它要么是空白以匹配所有内容,要么包含特定参数(一个或两个),具体取决于内容是否为 null。

如果您的输入有一些结构,那么您可以更加动态:

$input = array("fruit" => "apple", "vegetable" => "spinach");

$query = array();

foreach ( $input as $key => $value ) {
$query["favorites.$key"] = $value;
}

它通过附加到 $query 来做同样的事情,但以比单个变量更动态的方式。

另请注意,就 MongoDB 而言,您的文档结构不是很好。它可能真的应该是这样的:

{
"_id" : ObjectId("55de8a17f8389e208a1e7d7e"),
"name" : "john",
"favorites" : [
{ "type": "vegetable", "name": "spinach" },
{ "type": "fruit", "name": "apple" }
]
}

虽然最初看起来查询有点复杂,但在查询中删除“蔬菜”和“水果”等键的“特定路径”有很多好处,可以让生活变得更轻松,而且主要是“数据”可以被“索引”。键名不可索引以供搜索,因此效率低下:

$input = array("fruit" => "apple", "vegetable" => "spinach");

$query = array();

foreach ( $input as $key => $value ) {
$query['$and'][] = array(
'favorites' => array(
'$elemMatch' => array(
'type' => $key, 'name' => $value
)
)
);
}

使用 $elemMatch 是一个不错的查询查找包含“所有”数组元素的文档,其中“同时”包含输入列表中指定项的“类型”和“名称”。

在 JSON 中基本上是这样的:

{
"$and": [
{ "favorites": {
"$elemMatch": {
"type": "fruit", "name": "apple"
}
}},
{ "favorites": {
"$elemMatch": {
"type": "vegetable", "name": "spinach"
}
}}
]
}

这一切都归结为了解如何使用您选择的语言操作数据结构,就您的语言而言,“数据结构”实际上就是所有 MongoDB 查询。

至于结构的变化,那么假设找到“最爱”中有“蔬菜”的人现在变成了这样:

{ "favorites.type": "vegetable" }

这很好,因为“favorites.type”可以被索引,而不是:

{ "favorites.vegetable": { "$exists": true } }

虽然这可以“从技术上”使用索引,但实际上并没有以如此好的方式做到这一点。因此,改变模式的表示方式是可取的,并提供了更大的灵 active 。

关于php - MongoDB 搜索的用户输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303483/

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