【问题标题】:Why does my mongodb query return 0 results?为什么我的 mongodb 查询返回 0 个结果?
【发布时间】:2019-04-16 10:09:17
【问题描述】:

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


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

【问题讨论】:

    标签: mongodb go


    【解决方案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

    【讨论】:

    • 非常感谢!你让我省了很多麻烦!
    猜你喜欢
    • 2017-12-12
    • 1970-01-01
    • 2020-05-04
    • 2017-01-17
    • 2015-11-01
    • 1970-01-01
    • 2020-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多