mongodb - 从 mgo (golang+MongoDB) 中的嵌入式数组中检索元素

标签 mongodb go mgo

我在后端使用 golang,并使用 mongoDB 作为数据库。当我尝试从其中一个嵌入式数组中检索文档时,我在结果中只获得了嵌入式数组的一个索引。

我的结构是这样的

type (
    Employee struct {
        Name           string
        EmpId          string
        Password       string
        Leave        []*LeaveInfo
    }
LeaveInfo struct {

        Id              int
        Days            float64
        From            time.Time
        To              time.Time
        AppliedDate     time.Time
        Status          string
        ApprovedDate    time.Time
    }

我的golang代码是

   t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC)
    var result []*Employee
        if e := c.Find(nil).Select(bson.M{"leave": bson.M{
            "$elemMatch": bson.M{
                "from": bson.M{
               "$gte":t, 
    },
            },
        },
        },
        ).All(&result); e != nil {
            fmt.Println(e)
}

我的数据库结构是

_id:57d7a6673897593ae84bed49{
Name:"Mark"
EmpId:"E123"
Password:1234
Leave:[
{
    "id" : 0,
    "days" : 1.5,
    "from" : ISODate("2016-12-01T00:00:00Z"),
    "to"   : ISODate("2016-12-02T12:00:00Z"),
    "applieddate" : ISODate("0001-01-01T00:00:00Z"),
    "status" : "Approved",
    "approveddate" : ISODate("0001-01-01T00:00:00Z"),

  },
{

    "id" : 1,
    "days" : 2.0,
    "from" : ISODate("2016-12-11T00:00:00Z"),
    "to" : ISODate("2016-12-12T00:00:00Z"),
    "applieddate" : ISODate("0001-01-01T00:00:00Z"),
    "status" : "Approved",
    "approveddate" : ISODate("0001-01-01T00:00:00Z"),

  },
]
}

在这里,我只得到 Leave 数组的索引 0。正如你所看到的,数组的两个索引都有大于 t 的日期。但是当我检索它时,我只得到一个索引(索引 0)。但是我需要的是检索所有日期大于 t 的索引。请帮助我。谢谢

我的结果如下

{
    "Name": "",

    "EmpId": "",
    "Password": "",
"Leave": [
      {

        "Id": 0,
        "Days": 1.5,
        "from" : ISODate("2016-12-01T00:00:00Z"),
        "to"   : ISODate("2016-12-02T12:00:00Z"),
        "applieddate" : ISODate("0001-01-01T00:00:00Z"),
        "status" : "Approved",
        "approveddate" : ISODate("0001-01-01T00:00:00Z"),
      }
    ]
}

最佳答案

我不确定在单个 mongo 查询中是否可以实现您的要求。我宁愿得到所有 元素和过滤器是这样的:

var result []*Employee
err := c.Find(nil).All(&result)
if err != nil {
    // do stuff...
}

// For each result, filter the Leave values having a to small From value.
t := time.Date(2016, 10, 1, 0, 0, 0, 0, time.UTC)
for i := range result {
    var j int
    for j < len(result[i].Leave) {
        if result[i][j].From.Before(t) {
            result[i] = append(result[i][:j], result[i][j+1:]...)
            continue
        }
        j++
    }
}       

关于mongodb - 从 mgo (golang+MongoDB) 中的嵌入式数组中检索元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39464370/

相关文章:

node.js - 具有ElasticSearch映射和Mongoosastic的MongoDB

go - 如何从 Go 自定义类型获取底层变量

go time.Parser 错误,日期为 DMYYYY

mongodb - 根据 map 值更新mongo文档并删除该值

mongodb - 如何在 mGo 中动态转换结果文档

mongodb - Azure Cosmos DB 检查字段中的数组是否包含在搜索数组中

python - mongodb 中的 StringField 要求

mongodb - 有没有一种简单的方法可以将文档属性作为参数列表传递给 $setEquals 等运算符?

go - 我无法安装 go 包

go - Mgo 单个 bson.M 结果无法正常工作