2016-10-07 5 views
1

Я использую Golang в качестве моего бэкэнд и MongoDB как базу данных для своего веб-приложения. Мне нужно добавить два значения и проверить, больше ли значение в базе данных, чем добавленное значение, и если это так, мне нужно удалить строку из MongoDB.
код, который я написал следующим образом

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

FYI: Я написал пример кода для MongoDB, но это не работает, а

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

Пожалуйста, дайте мне знать, если это возможно. И, пожалуйста, дайте мне альтернативный способ сделать это.
Thanks

+1

Можете ли вы опубликовать, как выглядит ваш документ? из того, что я вижу, ваш подход ошибочен, потому что $ add - это то, что вы используете с агрегацией, вы не можете просто использовать его с обычными CRUD-запросами. –

+1

вы не можете использовать $ add нормально .... это только для агрегирования части чувака –

ответ

4

1- Если вам нужно удалять строки с полем, напримерtime > t + 10 из MongoDB, вам do't нужно $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/

+2

Большое спасибо .... –

0

Вот что я предлагаю. Вы можете сделать это в два шага, а не в одном.

сначала найдите все записи, которые соответствуют критериям, которые вы удаляете. Затем удалите соответствующие записи, используя запрос remove().

В следующем запросе будут возвращены все документы с текущим временем больше 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 } 

как вы можете видеть из результатов что документы с текущим временем 100 и 150 вернулись с ошибкой, так как они меньше 200.

0

Теперь это способ, чтобы удалить документы:

Что вы делали:

вы не можете просто использовать $ добавить этот оператор работает только с совокупной системой

Что вы должны делать на самом деле

  1. Получить Все отчеты должны быть удалены с помощью агрегатных методологий
  2. Выполнить петлю над ними и удалить

Пример:

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

0

Основываясь на примере кода, я могу заметить, что вы используете команду MongoDB remove фильтровать только значения поля currenttime больше, чем определенное значение.

Если вы намерены удалить определенные документы после того, как они прошли определенное время, вы должны проверить функцию MongoDB Time To Live. Где можно Expire Data from Collections

Например, вы можете указать:

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

истекают какие-либо документы из коллекции через один час. См. Также TTL Indexes

Хотя этот ответ не содержит кода, связанного с Голаном, если это то, что вы пытаетесь сделать на большой картинке, это может быть полезно для вашего случая использования.