IT虾米网

MongoDB bson.M 查询

bonelee 2023年11月29日 编程语言 170 0

我正在尝试使用野牛查询 MongoDB 中带有两个字段的所有 JSON 数据,但结果为空。

{ 
        "allowedList": [ 
            { 
                "List": [ 
                    { 
                        "allow": { 
                            "ss": 1, 
                        }, 
                        "Information": [ 
                            { 
                                "Id": "Id1" 
                            } 
                        ] 
                    } 
                ] 
            } 
        ] 
        } 

我能够在命令行使用 MongoDB 过滤所有内容

    db.slicedb.find({"allowedList.List.allow.ss":1,"allowedList.List.Information.nsiId":"Id-Id21"})  
but using  
 
query := bson.M{"allowedList.List.allow": bson.M{"ss": sst}, "allowedList.List.Information": bson.M{"Id": Id}} 

sst和Id是查询函数的整数和字符串输入

err := db.C(COLLECTION).Find(query).All(&specificSlices) 

但不起作用,即使有与这两个字段匹配的 json 数据,我也会得到 null。有人可以帮助指出我的查询有什么问题吗?

服务器和数据库配置

type SliceDataAccess struct { 
        Server   string 
        Database string 
   } 
 
 
 
var db *mgo.Database 
 
const ( 
    COLLECTION = "slicedb" 
  ) 

建立数据库连接

func (m *SliceDataAccess) Connect() { 
        session, err := mgo.DialWithTimeout(m.Server, 20*time.Second) 
            if err != nil { 
                log.Fatal(err) 
            } 
            db = session.DB(m.Database) 
        } 

结构字段

type InstanceInfo struct { 
     ID     string    `json:"nfId" bson:"_id"` 
     AllowedList []AllowedNssai `json:"allowedList" bson:"allowedList"` 
 
   } 
 
type AllowedNssai struct { 
        List []AllowedSnssai `json:"List,omitempty" bson:"List"` 
        ... 
     } 
 
type AllowedSnssai struct { 
      Allow *Snssai `json:"allow,omitempty" bson:"allow"` 
      Information []NsiInformation `json:"Information,omitempty" bson:"Information"` 
 
  } 
 
type NsiInformation struct { 
      Id string `json:"Id" bson:"Id"` 
   } 
 
 
 
 
type Snssai struct { 
      Ss int32  `json:"sst" bson:"ss"` 
 
   } 

查询函数定义

func (m *SliceDataAccess) FindAll(sst int32, nsiId string ([]InstanceInfo, error) { 
var specificSlices []InstanceInfo 
 
query := bson.M{"allowedList.List.allow": bson.M{"ss": sst}, "allowedList.List.Information": bson.M{"Id": nsiId}} 
 
err := db.C(COLLECTION).Find(query).All(&specificSlices) 
if err != nil { 
       return specificSlices, err 
       } 
        return specificSlices, nil 
     } 

请求和响应的 HTTP 处理函数

func AvailabilityGet(w http.ResponseWriter, r *http.Request)  
            var slice InstanceInfo 
            err := json.NewDecoder(r.Body).Decode(&slice) 
            if err != nil { 
                respondWithError(w, http.StatusBadRequest, "Object body not well decoded") 
                return 
            } 
            sst := slice.AllowedList[0].List[0].Allow.Sst 
            nsiId := slice.AllowedList[0].List[0].Information[0].Id 
 
            specificSlices, err := da.FindAll(sst, nsiId) 
 
            json.NewEncoder(w).Encode(specificSlices) 
        } 

附件是我完成的完整代码。

请您参考如下方法:

这有效

query := bson.M{"allowedNssaiList.allowedSnssaiList.allowedSnssai.sst": sst, "allowedNssaiList.allowedSnssaiList.nsiInformationList.nsiId": nsiId}


评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!