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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (249)

这是我的数据库集合: 使用此代码,我尝试让所有参与故事的用户或使用给定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())
    }
}

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

提问于
用户回答回答于

您的查询转换为:

{"$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>}]}

这是您的查询未返回任何值的原因(并且没有错误,因为查询语法是正确的)。

有两种使用点表示法查询嵌套在数组中的文档的方法。如果您知道文档的数组索引,则只需指定位置:

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:查询文档

扫码关注云+社区

领取腾讯云代金券