需要在mgo中使用$ add和$ gt删除(Golang&& MongoDB)

时间:2016-10-07 01:56:11

标签: mongodb go bson mgo

我使用Golang作为我的后端,使用MongoDB作为我的Web应用程序的数据库。我需要添加两个值并检查数据库中的值是否大于添加值,如果是,我需要从MongoDB中删除该行。
我写的代码如下

err, err1 := c.RemoveAll(bson.M{
        "currenttime": bson.M{
            "$gt": bson.M{
                "$add": []interface{}{time.Now().Unix(),"100"},
            },
        },
     })

仅供参考:我编写了MongoDB的示例代码,但这样做不太好用

db.Collection.remove(
   {currenttime:{
        $gt:{
                $add:[100,100]
             }
              }
    }
 )

如果可能,请告诉我。请给我任何其他方法来做到这一点 感谢

4 个答案:

答案 0 :(得分:4)

1-如果您需要删除包含字段的行,例如来自MongoDB的time > t + 10,您不需要$add,您可以使用:

info, err := c.RemoveAll(bson.M{"time": bson.M{"$gt": t + 10}})
if err != nil {
    panic(err)
}

以下是工作代码:

package main

import (
    "fmt"
    "time"

    "gopkg.in/mgo.v2"
    "gopkg.in/mgo.v2/bson"
)

func main() {
    session, err := mgo.Dial("localhost")
    if err != nil {
        panic(err)
    }
    defer session.Close()
    session.SetMode(mgo.Monotonic, true) // Optional. Switch the session to a monotonic behavior.
    c := session.DB("test").C("Model")
    c.DropCollection()
    t := time.Now().UTC().Unix()
    err = c.Insert(
        &Model{bson.NewObjectId(), "n1", t},
        &Model{bson.NewObjectId(), "n2", t + 50},
        &Model{bson.NewObjectId(), "n3", t + 100},
        &Model{bson.NewObjectId(), "n4", t + 150})
    if err != nil {
        panic(err)
    }
    r := []Model{}
    err = c.Find(nil).All(&r)
    if err != nil {
        panic(err)
    }
    fmt.Println(r)

    info, err := c.RemoveAll(bson.M{"time": bson.M{"$gt": t + 10}})
    if err != nil {
        panic(err)
    }
    fmt.Println(info)

    r2 := []Model{}
    err = c.Find(nil).All(&r2)
    if err != nil {
        panic(err)
    }
    fmt.Println(r2)
}

type Model struct {
    ID   bson.ObjectId `json: "_id,omitempty" bson: "_id,omitempty"`
    Name string        `json: "name" bson: "name"`
    Time int64         `json: "time" bson: "time"`
}

输出:

[{ObjectIdHex("57f7354cc3176906c0ca7516") n1 1475818828} {ObjectIdHex("57f7354cc3176906c0ca7517") n2 1475818878} {ObjectIdHex("57f7354cc3176906c0ca7518") n3 1475818928} {ObjectIdHex("57f7354cc3176906c0ca7519") n4 1475818978}]
&{0 3 3 <nil>}
[{ObjectIdHex("57f7354cc3176906c0ca7516") n1 1475818828}]

2-对于$add,请参阅:
Query where sum of two fields is less than given value
https://docs.mongodb.com/manual/reference/operator/aggregation/add/

答案 1 :(得分:0)

这是我的建议。你可以分两步而不是一步完成。

首先找到与您匹配的所有条目删除条件。然后使用remove()查询删除那些匹配的条目。

以下查询将返回currentTime大于200的所有文档。(添加100到100)。

db.Collection.aggregate(
   [
     { $project: { currentTime: 1, current_time:{ $gt: [ "$currentTime", { $add: [ 100,100 ] } ] } }}
   ]
)

我使用以下数据创建了一个样本集合:

{ "_id" : ObjectId("57f714f0b30252798d8a2988"), "currentTime" : 1000 }
{ "_id" : ObjectId("57f714f4b30252798d8a2989"), "currentTime" : 100 }
{ "_id" : ObjectId("57f714f7b30252798d8a298a"), "currentTime" : 150 }
{ "_id" : ObjectId("57f714fcb30252798d8a298b"), "currentTime" : 1250 }

以上查询对此集合的结果是:

{ "_id" : ObjectId("57f714f0b30252798d8a2988"), "currentTime" : 1000, "current_time" : true }
{ "_id" : ObjectId("57f714f4b30252798d8a2989"), "currentTime" : 100, "current_time" : false }
{ "_id" : ObjectId("57f714f7b30252798d8a298a"), "currentTime" : 150, "current_time" : false }
{ "_id" : ObjectId("57f714fcb30252798d8a298b"), "currentTime" : 1250, "current_time" : true }

从结果中可以看出,currentTime为100和150的文档返回false,因为它们小于200.

答案 2 :(得分:0)

现在这是删除文件的方法

你在做什么:

  

您不能简单地使用$ add,因为此运算符仅适用于聚合系统

你应该做什么

  1. 使用聚合方法
  2. 获取要删除的所有记录
  3. 对它们运行循环并删除
  4. <强> 实施例

    var cursor = db.Collection.aggregate([ { $match: { currenttime: { $gt:{ $add:[100,100] }}}} ]); cursor.forEach(function (doc){ db.Collection.remove({"_id": doc._id}); });

答案 3 :(得分:0)

根据您的示例代码,我可以观察到您使用MongoDB remove命令仅过滤字段currenttime的值大于特定值。

如果您打算在超过特定时间后删除某些文档,则应查看MongoDB Time To Live功能。你可以在哪里Expire Data from Collections

例如,您可以指定:

db.collection.createIndex( { "field_containing_time": 1 }, { expireAfterSeconds: 3600 } )

一小时后使集合中的所有文档失效。另请参阅TTL Indexes

虽然这个答案不包含与Golang相关的代码,但如果您正在尝试大图,那么它可能对您的用例有益。