为什么我的mongodb查询返回0个结果?

时间:2019-04-15 20:09:50

标签: mongodb go

这是我的数据库集合: Documents
通过这段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())
    }
}


该代码不会输出任何错误,但是也不会输出任何对象...
感谢您的提前帮助!

1 个答案:

答案 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)

另请参阅MongoDB: Query Documents