2016-10-07 14 views
1

私はGolangを私のバックエンドとして使用し、MongoDBはWebアプリケーションのデータベースとして使用しています。私は2つの値を追加し、データベースの値が追加された値よりも大きいかどうかを確認する必要があります。もしそうなら、私はMongoDBから行を削除する必要があります。 FYI

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] 
      } 
       } 
    } 
) 

が私に教えてください。そして、私にこれを行うための代替方法を教えてください。
ありがとう

+1

ドキュメントの見た目を投稿できますか? $ addは集約で使用するものなので、私はあなたのアプローチが間違っていると見ています。通常のCRUDクエリでは使用できません。 –

+1

あなたは$ addを普通に使うことはできません....それは集約部分のためだけです –

答えて

4

の1-フィールドのある行を削除するtime > t + 10のMongoDBから、あなたが$addが必要do't、あなたが使用することができます:ここで

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

ここに私が提案しているものがあります。あなたは1つではなく2つのステップでそれを行うことができます。

最初に条件を削除するすべてのエントリを見つけます。次に、remove()クエリを使用して一致するエントリを削除します。

以下のクエリは、currentTimeが200以上のすべてのドキュメントを返します(100から100を追加します)。

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

iは、次のデータでサンプル収集を作成:

{ "_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であるドキュメントは、200未満であるためfalseを返しました。

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

あなたのサンプルコードに基づいて、私はあなたが特定の値よりも大きいcurrenttimeフィールドの値のみをフィルタリングするためにMongoDBのremoveコマンドを使用することを観察することができます。

一定の時間が経過した後に特定のドキュメントを削除する場合は、MongoDB Time To Live機能をチェックしてください。あなたはExpire Data from Collections

たとえば、次のように指定することができますすることができます。ここで

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

は1時間後にコレクションから任意の文書を期限切れにします。関連項目TTL Indexes

この回答にはGolang関連のコードは含まれていませんが、これが大きな図で何をしようとしているのであれば、あなたのユースケースにとって有益かもしれません。

関連する問題