首页 文章

使用elemMatch从MongoDB中的Array获取数据

提问于
浏览
1

我在产品系列中有以下文件 .

db.product.find()
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }
{ "_id" : 2, "results" : [ { "product" : "abc", "score" : 8 }, { "product" : "xyz", "score" : 7 } ] }
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }

以下查询使用elemMatch按预期返回结果 .

> db.product.find(  {  results :  { $elemMatch :   { product : "xyz" , score : { $eq : 5}  }  } }   )
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }

同样,这也会返回预期的结果 .

> db.product.find(  {  results :  {    product : "xyz" , score : 5  }   }   )
{ "_id" : 1, "results" : [ { "product" : "abc", "score" : 10 }, { "product" : "xyz", "score" : 5 } ] }

但是当我在数组中使用比较运算符时,我没有得到任何结果 .

db.product.find(  {  results :  {    product : "xyz" , score : { $eq : 5}  }   }   )

我无法弄清楚这种意想不到的行为 .

2 回答

  • 2

    有两种方法可以进行查询:传递子文档和使用点表示法 .

    要查询嵌套字段,您应该使用点表示法 . 这意味着你需要做:

    db.test.find({"results.product": "xyz", "results.score": {$eq : 5}})
    

    如果你像那样传递一个子文档,那么mongoDB会完全匹配 . 这意味着不应该有任何其他属性,基本上在你的情况下,它希望得分为{“$ eq”:5}(字面上有名为$ eq的属性)

    欲了解更多信息,请查看this answerdocumentation .

  • 0

    我已经为所有4个命令运行了解释 . 以下是mongoDB在内部创建的过滤器:

    db.product.find({ results : { product : "xyz" , score : 5  }   }).explain()
    "filter" : {
                    "results" : {
                        "$eq" : {
                            "product" : "xyz",
                            "score" : 5
                        }
                    }
                }
    
    
    db.product.find({ "results.product" : "xyz" , "results.score" : 5   }).explain()
          "filter" : {
                        "$and" : [
                            {
                                "results.product" : {
                                    "$eq" : "xyz"
                                }
                            },
                            {
                                "results.score" : {
                                    "$eq" : 5
                                }
                            }
                        ]
                    }
    
    db.product.find(  {  results :  { $elemMatch :   { product : "xyz" , score : { $eq : 5}  }  } }   ).explain()
              "filter" : {
                            "results" : {
                                "$elemMatch" : {
                                    "$and" : [
                                        {
                                            "product" : {
                                                "$eq" : "xyz"
                                            }
                                        },
                                        {
                                            "score" : {
                                                "$eq" : 5
                                            }
                                        }
                                    ]
                                }
                      }
                    }
    
    db.product.find(  {  results :  {    product : "xyz" , score : { $eq : 5}  }   }   ).explain()
    
                        "filter" : {
                                    "results" : {
                                        "$eq" : {
                                            "product" : "xyz",
                                            "score" : {
                                                "$eq" : 5
                                            }
                                        }
                                    }
                                }
    

相关问题