Mongodb:使用条件更新文档的多个字段

vtwuwzda  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(222)

我是mongodb的新手。我有一个对象,看起来像这样

{
  "_id" : 1,
  "name" : "Alex",
  "quantity" : 10,
  "lastActivityTime" : ISODate("2022-09-01T03:38:29Z"),
  "lastRefreshTime" : ISODate("2022-10-01T20:54:19.618Z"),
  "checking": [1, 2, 3],
}

我想更新此文档,但有以下条件:
1.如果lastActivityTimedeadline之前,则增加quantity
1.否则,请保持quantity不变。
在这两种情况下,我还需要删除checking字段中的值(例如3),并将lastActivityTime更新为当前时间。
这是我目前的代码。它的工作,但它需要运行updateOne()两次。有没有更有效的方法?

r, err := s.collection.UpdateOne(ctx,
    bson.M{
        "_id": 1,
        "lastActivityTime": bson.M{"$not": bson.M{"$gte": deadline}}},
    bson.M{
        "$set": bson.M{
            "lastActivityTime":  time.Now(),
        },
        "$inc": bson.M{
            "quantity": 1,
        },
        "$pull": bson.M{
            "checking":       3,
        },
    },
)
if r.MatchedCount == 0 {
    r, err = s.accountTokenCollection.UpdateOne(ctx,
        bson.M{
            "_id": 1,
            "lastActivityTime": bson.M{"$gte": deadline}},
        bson.M{
            "$set": bson.M{
                "lastRefreshedTime": time.Now(),
            },
            "$pull": bson.M{
               "checking":       3,
            },
        },
    )
6rqinv9w

6rqinv9w1#

我不知道Go语言的等价形式,但是可以使用文档更新的流水线形式,如下所示:

db.collection.update({
  _id: 1
},
[
  {
    "$set": {
      "quantity": {
        $cond: {
          if: {
            $lt: [
              "$lastActivityTime",
              ISODate("2022-09-01T03:38:30Z")
            ]
          },
          then: {
            $sum: [
              "$quantity",
              1
            ]
          },
          else: "$quantity"
        }
      },
      "lastActivityTime": "$$NOW",
      "checking": {
        $filter: {
          input: "$checking",
          as: "item",
          cond: {
            $ne: [
              "$$item",
              3
            ]
          }
        }
      }
    }
  }
])

这是Playground。

相关问题