mongodb 有没有什么有效的方法可以让我只获取用户填写的字段,而不必执行无限的If?

cvxl0en2  于 2023-01-12  发布在  Go
关注(0)|答案(1)|浏览(84)

我在mongodb中有一个集合,包含数千个数据,格式如下(存在更多7个数据):
_ID:对象ID('63be16e7096c04c6f351c60c
城市:“里约”
经济:“旅游业”
人口:600万
日期:2019年1月4日03:00:00. 000 +00:00
我有一个在python中有多个字段的表单(存在更多的7个条目)。

self.bt_search = Button(self.fr_body, text='Search', command=self.search_data)

self.city_entry = Entry(self.fr_body)
self.economy_entry = Entry(self.fr_body)
self.population_entry = Entry(self.fr_body)
self.data_entry = Entry(self.fr_body)

用户可以填写他想要筛选结果的任何字段。例如:他可以只填写“城市”字段,或者填写“城市”和“经济”,或者填写“日期”和“经济”,以及所有其他可能性。
有没有什么有效的方法可以让我通过类型化字段来获取数据,而不必填充无限的If?
我是这样做的:

if self.city_entry != '':
    result = connect.db.my_colletion.find({})
            for value in values:
                if value['city'] == self.city_entry:
                    # print the values found
                   
if self.city_entry != '' and self.economy_entry != '':
    result = connect.db.my_colletion.find({})
            for value in values:
                if value['city'] == self.city_entry and value['economy'] == self.economy_entry:
                    # print the values found
.
.
.

我尝试测试填充字段。我希望它只返回已填充的字段。我没有完成如果,因为在我原来的项目中,我有另外7个字段。
我使用的是python 3和mongodb6。
抱歉,我的英语。

w41d8nur

w41d8nur1#

假设如果没有提供该值,则该值为None,您可以将$or$eq以及null一起使用,以跳过对该条目输入的检查,然后可以使用$and链接多个检查。

db.collection.find({
  $expr: {
    $and: [
      {
        $or: [
          {
            $eq: [
              null,
              "Rio"// self.city_entry
              
            ]
          },
          {
            $eq: [
              "$city",
              "Rio"// self.city_entry
              
            ]
          }
        ]
      },
      {
        $or: [
          {
            $eq: [
              null,
              null// self.economy_entry
              
            ]
          },
          {
            $eq: [
              "$economy",
              null// self.economy_entry
              
            ]
          }
        ]
      },
      {
        $or: [
          {
            $eq: [
              null,
              null// self.population_entry
              
            ]
          },
          {
            $eq: [
              "$population",
              null// self.population_entry
              
            ]
          }
        ]
      },
      {
        $or: [
          {
            $eq: [
              null,
              null// self.date_entry
              
            ]
          },
          {
            $eq: [
              "$date",
              null// self.date_entry
              
            ]
          }
        ]
      }
    ]
  }
})

Mongo Playground

相关问题