我使用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]
}
}
}
)
如果可能,请告诉我。请给我任何其他方法来做到这一点 感谢
答案 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,因为此运算符仅适用于聚合系统
你应该做什么
<强> 实施例 强>:
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相关的代码,但如果您正在尝试大图,那么它可能对您的用例有益。