mongodb - 如何对嵌套文档使用元素查询运算符 ($exists)?
问题描述
我正在尝试使用 Go 查找嵌套文档中是否存在字段。
我正在尝试查看该用户的购物车中是否存在项目 ID 字段 - 5f15d53f205c36fa8b022089。使用 Mongo Compass,我能够使用此过滤器命令成功查询正确的文档。
{"_id": ObjectId('5f19a8950268ef67ce0c5124'), "shoppingCart.items.5f15d53f205c36fa8b022089": {$exists: true}}
我尝试在 Go 中使用相同的语法,但我仍然没有从结果中得到任何回报。
cursor, err := customersCollection.Find(
ctx,
bson.M{"_id": customerID, "shoppingCart.items.5f15d53f205c36fa8b022089": bson.M{"$exists": true}},
options.Find().SetProjection(bson.M{"_id": 1}),
)
// This is how I am reading the results from the cursor. When
// printing the results, I get an empty array.
var results []bson.M
if err = cursor.All(ctx, &results); err != nil {
customerLog.Errorf(logger.LogError(logger.LogInfo()), err)
}
fmt.Printf("Products Result: %v\n", results)
我找不到任何有关在过滤器参数中包含元素查询运算符的正确方法的文档。
这是我正在使用的 Mongo 驱动程序,https://godoc.org/go.mongodb.org/mongo-driver/mongo
编辑 1.0 我尝试过的事情:
使用 bson.D 而不是 bson.M。更新了代码段。
光标,错误:= customersCollection.Find(ctx, bson.D{{"_id", customerID}, {"shoppingCart.items.5f15d53f205c36fa8b022089", bson.D{{"$exists", true}}}},选项。 Find().SetProjection(bson.M{"_id": 1}), )
解决方案
如果您使用go.mongodb.org/mongo-driver/bson
包,您可以执行以下操作:
query := bson.M{}
query["_id"] = bson.M{
"$exists": true,
}
如果你愿意,你也可以通过使用包装器来做更清洁:
type FilterQuery bson.M
func NewFilterQuery() FilterQuery {
return FilterQuery(bson.M{})
}
func (q FilterQuery) SetIdExists(exist bool) FilterQuery {
q["_id"] = bson.M{
"$exists": exist,
}
return q
}
然后从您的代码中,您可以执行类似的操作
query := NewFilterQuery()
query.SetIdExist(true)
..
cursor, err := customersCollection.Find(
ctx,
query,
)
...
推荐阅读
- omnet++ - 如何在静脉中记录 rssi (omnet++)
- python - 如何避免复数并获得浮点数?
- javascript - 检查选中的单选按钮是否返回 true 但应该为 false
- scala - Scala:克服隐式解析的泛型类型擦除
- sql - SQL 帮助 - 加入不需要所有列的小型查找表(以及其他选项)
- .htaccess - htaccess 复杂的重定向建议
- python - Python检查二维列表是否包含另一个列表的数字
- r - 将 p 值添加到平行坐标图 (ggplot) 时出错
- tableau-api - 更改饼图中的标签颜色
- tomcat - 如果多个服务在一个 Tomcat 服务器上运行,这是如何实现的?