这是我的数据库集合:
通过这段go代码,我尝试吸引所有参与故事或使用给定ID创建故事的用户。
func main() {
for stf.DB == nil {
}
collection := stf.DB.Collection("user")
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()
id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
fter := bson.M{"_id": id}
involvedFilter := bson.M{"stories_involved": fter}
createdFilter := bson.M{"stories_created": fter}
filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}
cur, err := collection.Find(ctx, filter)
if err != nil {
log.Fatal(err.Error())
}
defer cur.Close(ctx)
for cur.Next(ctx) {
var result bson.M
err := cur.Decode(&result)
if err != nil {
log.Fatal(err.Error())
}
fmt.Println(result)
}
if err := cur.Err(); err != nil {
log.Fatal(err.Error())
}
}
该代码不会输出任何错误,但是也不会输出任何对象...
感谢您的提前帮助!
答案 0 :(得分:1)
您的查询翻译为:
{"$or":[
{"stories_involved":{
"_id": ObjectId("5cb4dd7e29d3dca573a73d4c")}},
{"stories_created":{
"_id":ObjectId("5cb4dd7e29d3dca573a73d4c")}}
]}
这意味着它正在搜索带有嵌套文档的文档 即:
{stories_involved: {_id: <value>}}
或{stories_created: {_id: <value>}}
。
但是,集合中的文档包含嵌套文档数组,即:
{stories_involved: [{_id:<value>}]}
或{stories_created: [{_id:<value>}]}
这是查询不返回任何值的原因(并且没有错误,因为查询语法正确)。
Querying a document nested in an array使用dot notation的方法有两种。如果您知道文档数组的索引,则只需指定位置:
id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
involvedFilter := bson.M{"stories_involved.0._id": id}
createdFilter := bson.M{"stories_created.0._id": id}
filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}
cur, err := collection.Find(ctx, filter)
如果您不知道嵌套在数组中的文档的索引位置,请使用点(。)和嵌套文档中的字段名称来连接数组字段的名称:
id, _ := primitive.ObjectIDFromHex("5cb4dd7e29d3dca573a73d4c")
involvedFilter := bson.M{"stories_involved._id": id}
createdFilter := bson.M{"stories_created._id": id}
filter := bson.M{"$or": []bson.M{involvedFilter, createdFilter}}
cur, err := collection.Find(ctx, filter)