Golang中MongoDB UpdateOne多条件更新操作指南

Golang中MongoDB UpdateOne多条件更新操作指南 我正在绞尽脑汁,尝试基于多个条件更新文档。

有人知道如何将这个:

filter := bson.D{{"_id", employee.ID}}

转换成多个条件,比如下面这样(两个版本都不起作用):

		filter := bson.D{
			{"$and", bson.D{
				{"_id", employee.ID},
				{"customerid", customerID},
			}},
		}

或者(结果是: 多个写入错误:[{写入错误:[{$and 必须是一个数组}]}, {}]

	filter := bson.D{
		{"$and", bson.D{
			{"_id", employee.ID},
			{"customerid", employee.CompanyID},
		}},
	}

如果有人能帮我阐明这个问题,我将不胜感激 😎

干杯


更多关于Golang中MongoDB UpdateOne多条件更新操作指南的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

非常感谢您为我指明了正确的方向 😊

最终通过以下代码实现了功能:

	filter := bson.M{
		"$and": []bson.M{
			{"_id": employee.ID},
			{"customerid": employee.CompanyID},
		},
	}

更多关于Golang中MongoDB UpdateOne多条件更新操作指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我虽然没有亲自使用过这个客户端,但根据错误信息判断,以下修改应该能解决问题:

	filter := bson.M{
		{"$and": []bson.M{
			bson.M{"_id", employee.ID},
			bson.M{"customerid", employee.CompanyID},
		}},
	}

"$and"操作符需要一个数组,所以在查询条件前添加[]

编辑: 我查阅了文档,你应该使用bson.M,而且"$and"应该作为键名而不是像你在问题中写的那样作为值。

在Go语言中使用MongoDB的UpdateOne操作时,构建多条件过滤器需要正确使用BSON文档结构。你的问题在于$and操作符的使用方式不正确。$and操作符需要一个BSON数组(bson.A)作为值,而不是BSON文档(bson.D)。

以下是正确的实现方式:

filter := bson.D{
    {"$and", bson.A{
        bson.D{{"_id", employee.ID}},
        bson.D{{"customerid", customerID}},
    }},
}

或者更简洁的方式,直接使用多个字段条件(MongoDB会隐式地使用$and操作符):

filter := bson.D{
    {"_id", employee.ID},
    {"customerid", customerID},
}

完整示例代码:

package main

import (
    "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

type Employee struct {
    ID        string `bson:"_id"`
    CompanyID string `bson:"customerid"`
    Name      string `bson:"name"`
}

func main() {
    client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://localhost:27017"))
    if err != nil {
        log.Fatal(err)
    }
    defer client.Disconnect(context.TODO())

    collection := client.Database("testdb").Collection("employees")
    
    employee := Employee{
        ID:        "12345",
        CompanyID: "company_abc",
    }

    // 方法1:使用显式$and操作符
    filter := bson.D{
        {"$and", bson.A{
            bson.D{{"_id", employee.ID}},
            bson.D{{"customerid", employee.CompanyID}},
        }},
    }

    // 方法2:使用隐式$and(推荐,更简洁)
    filter = bson.D{
        {"_id", employee.ID},
        {"customerid", employee.CompanyID},
    }

    update := bson.D{
        {"$set", bson.D{
            {"name", "John Updated"},
        }},
    }

    result, err := collection.UpdateOne(context.TODO(), filter, update)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Matched %v document(s) and modified %v document(s)\n", 
        result.MatchedCount, result.ModifiedCount)
}

两种方法都能正常工作,但推荐使用第二种隐式$and的方式,因为它更简洁且性能相同。只有在需要复杂的逻辑组合(如混合使用$and$or等操作符)时,才需要使用显式的$and操作符。

回到顶部