我有以下代码,可从MongoDB数据库中的两个不同集合中检索两个数据集
opts := options.Find()
opts.SetProjection(bson.M{
"productId": 1,
"_id": 0,
})
cursor, err := currentProductsCollection.Find(ctx, bson.M{}, opts)
var oldProducts []bson.M
err = cursor.All(ctx, &oldProducts)
cursor, err = newProductsCollection.Find(ctx, bson.M{}, opts)
var newProducts []bson.M
err = cursor.All(ctx, &newProducts)
我希望能够将oldProducts
与newProducts
进行比较,以找出出现了哪些新的productId,以及消失了哪些旧的productId。
这两个变量都很好地加载了,我可以在调试器中愉快地检查它们,但是我似乎找不到一种比较它们的方法。我希望能够依次遍历每个对象,并在另一个对象上查找并得到几片缺失值,但是我找不到任何方法。
过去三个小时,我一直在这附近走动,所以如果有人有任何建议,我将非常欢迎他们。
我使用的是香草go.mongodb.org/mongo-driver驱动程序,而不是mgo
答案 0 :(得分:2)
通过产品ID为旧产品和新产品创建地图
oldProductsMap = make(map[interface{}]bson.M)
for _,oldp := range oldProducts {
oldProductsMap[oldp["productId"]] = oldp
}
newProductsMap = make(map[interface{}]bson.M)
for _,newp :=range newProducts {
newProductsMap[newp["productId"]] = newp
}
然后对于消失的产品,检查旧产品在newProductsMap
中。如果没有,则产品消失
var disProducts []bson.M
for _,oldp := range oldProducts {
if _, ok := newProductsMap[oldp["productId"]]; !ok {
disProducts = append(disProducts, oldp)
}
}
对于新出现的产品,请检查新产品在oldProductsMap
中。如果没有,那么该产品将重新出现。
var appProducts []bson.M
for _,newp := range newProducts {
if _, ok := oldProductsMap[newp["productId"]]; !ok {
appProducts = append(appProducts, oldp)
}
}
注意:您还可以在为新产品创建地图时执行此部分
答案 1 :(得分:1)
如果您确定所有条目都具有productId
字段:
func exists(in []bson.M,id interface{}) bool {
for _,p:=range in {
if id==p["productId"] {
return true
}
}
return false
}
然后使用它来扫描两个列表:
for _,oldp:=range oldProducts {
if !exists(newProducts,oldp["productId"]) {
// Removed
}
}
for _,newp:=range newProducts {
if !exists(oldProducts,newp["productId"]) {
// Added
}
}