英文:
Variable user selection
问题
我需要为用户创建一些变化,这样他就可以选择只有那些他指定类别的用户(按类别搜索),或者那些在数组中没有相同类别的用户。我查阅了文档并找到了这个答案:$ne操作符
但是它不起作用,我得到了所有用户的列表。
func (r *Mongo) User(ctx context.Context, query *domain.Query) ([]*User, error) {
var filter interface{}
if query.Query != "" {
filter = bson.D{primitive.E{Key: "status", Value: true}, primitive.E{Key: "category", Value: query.Query}}
} else {
filter = bson.D{primitive.E{Key: "status", Value: true}}
} - 这个是有效的
if query.OtherCategory {
category := []string{"it", "medical", "sport"}
filter = bson.M{"status": true, "category": bson.M{"$ne": category}}
} - 这个是无效的
cursor, err := r.col.Find(ctx, filter, opts)
var results []*domain.User
if err = cursor.All(ctx, &results); err != nil {
r.logger.Error().Err(err).Msg("failed find")
return nil, err
}
return results, nil
}
如何查询获取那些在数组中没有这些类别,并且状态为true的用户列表?
英文:
I need to create some variation for the user, so that he can select only those users for whom he specifies a category (search by category) or those who do not have the same categories as in the array (in the code you can see the array).
I used the documentation and found this answer: operator $ne
But it is not works, I get a list of all users
func (r *Mongo) User(ctx context.Context, query *domain.Query) ([]*User, error) {
var filter interface{}
if query.Query != "" {
filter = bson.D{primitive.E{Key: "status", Value: true}, primitive.E{Key: "category", Value: query.Query}}
} else {
filter = bson.D{primitive.E{Key: "status", Value: true}}
} - this works
if query.OtherCategory {
category := []string{"it", "medical", "sport"}
filter = bson.M{"status": true, "category": bson.M{"$ne": category}}
} - this it is not works
cursor, err := r.col.Find(ctx, filter, opts)
var results []*domain.User
if err = cursor.All(ctx, &results); err != nil {
r.logger.Error().Err(err).Msg("failed find")
return nil, err
}
return results, nil
}
How to make a query to get a list of users who don't have these (array of categories in the code) categories in the array, and their status is true?
答案1
得分: 2
$ne
("不等于")将列出用户的category
字段不是给定数组的文档。
但这不是你想要的:你想列出用户中没有给定类别的用户,或者换句话说,用户的类别与给定类别的交集为空。
为此,您必须使用$nin
("不在")运算符:列出类别不在给定数组中的用户。对于数组字段,将对所有数组元素进行检查。
if query.OtherCategory {
category := []string{"it", "medical", "sport"}
filter = bson.M{"status": true, "category": bson.M{"$nin": category}}
}
英文:
$ne
("not equal") will list you documents where the category
field of the user is not the given array.
But this is not you want: you want to list users where the user has none of the given categories, or in other words the intersection of the user's categories and the given categories is empty.
For this you have to use the $nin
("not in") operator: list users where the category is not in the given array. For array fields this will be checked for all array elements.
if query.OtherCategory {
category := []string{"it", "medical", "sport"}
filter = bson.M{"status": true, "category": bson.M{"$nin": category}}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论