当前位置: 首页 > 知识库问答 >
问题:

在mongoDB中查询文件数组的正确方法是什么?

阎丰羽
2023-03-14

以下是mongodb中的集合

{
"name" : "Tom" ,
"occupation" : "employee" ,
"data" : [
        {
            "owns" : "Television" ,
            "company" : "xyz"   
        },
        {
            "owns" : "Television" ,
            "company" : "abc"   
        },
        {
            "owns" : "laptop" ,
            "company" : "abc"
        } ,
        {
            "owns" : "Television" ,
            "company" : "xyz"
        }

        ]   
}

当我询问

   db.exp.find({"data.owns" : "Television"}) 

MongoDB返回结果集中具有"拥有":"笔记本电脑"的文档。

当我询问

   db.exp.find({"data.owns": "Television"},{_id: 0, data: {$elemMatch: {"owns": "Television"}}}) 

结果仅显示数据字段中第一个匹配“TV”的文档

我如何查询获得汤姆拥有电视的所有3个文档,不包括笔记本电脑文档。预期结果

 [
        {
            "owns" : "Television" ,
            "company" : "xyz"   
        },
        {
            "owns" : "Television" ,
            "company" : "abc"   
        },

        {
            "owns" : "Television" ,
            "company" : "xyz"
        }

 ]  

注意:在本例中,我只提到了数据字段中的4个文档,其中原始集合有50多个文档。对不起,我的英语很差:)。

共有2个答案

孔甫
2023-03-14

假设集合中有两个文档exp

[
  {
  "name" : "Tom" ,
  "occupation" : "employee" ,
  "data" : [ { "owns" : "Television" , "company" : "xyz" },
    { "owns" : "Television" , "company" : "abc" },
    { "owns" : "laptop" , "company" : "abc" } ,
    { "owns" : "Television" , "company" : "xyz" } ]   
  },
  {
  "name" : "Jerry" ,
  "occupation" : "employee" ,
  "data" : [ { "owns" : "Mobile" , "company" : "xyz" },
    { "owns" : "Mobile" , "company" : "abc" },
    { "owns" : "laptop" , "company" : "abc" } ,
    { "owns" : "Laptop" , "company" : "xyz" } ]   
  }
]

然后使用您的查询db。exp.find({“data.owns”:“Television”}),您将获得

{ "_id" : 101, 
"name" : "Tom", 
"occupation" : "employee", 
"data" : [ 
  { "owns" : "Television", "company" : "xyz" }, 
  { "owns" : "Television", "company" : "abc" }, 
  { "owns" : "laptop", "company" : "abc" }, 
  { "owns" : "Television", "company" : "xyz" } 
 ] 
}

由于第一个文档的owns字段等于Television,因此结果将是完整的第一个文档。(包括那些有拥有而不是电视的字段)第二个文档将不会是结果的一部分,因为它没有任何值为电视拥有字段。

$elemMatch只会返回一个文档。

http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

如果您只希望数组中的这三个对象的值为Television,那么您可以使用光标来存储查询的整个结果(在本例中仅一个文档)。

var x = db.authors.find({"data.owns": "Television"},{_id: 0, "data.owns": 1})

现在,使用for each循环仅获取具有值为Televisionowns文档。

宁弘亮
2023-03-14

这可以使用聚合来完成。

db.exp.aggregate(
    [
        { "$unwind": "$data" }, 
        { "$match": { "data.owns": "Television" }}, 
        {
            "$group": {
                          "_id": {
                                     "name": "$name",
                                     "occupation": "$occupation"
                                 }, 
                          "data": { "$push": "$data" }
                      }
        }, 
        {
            "$project": {
                            "name": "$_id.name", 
                            "occupation": "$_id.occupation", 
                            "data": 1, 
                            "_id": 0
                        }
        }
    ]
)

结果:

{
        "data" : [
                {
                        "owns" : "Television",
                        "company" : "xyz"
                },
                {
                        "owns" : "Television",
                        "company" : "abc"
                },
                {
                        "owns" : "Television",
                        "company" : "xyz"
                }
        ],
        "name" : "Tom",
        "occupation" : "employee"
}

 类似资料:
  • 问题内容: 我正在为MongoDB使用Node.JS驱动程序,我想执行一个同步查询,例如: 问题是,db.open是一个异步调用(它不会阻塞),因此getAThing返回“ undefined”,我希望它返回查询结果。我确定我可以使用某种阻止机制,但我想知道执行此类操作的正确方法。 问题答案: 没有办法使这种同步变得不可怕。正确的方法是接受回调函数作为参数,然后在可用时调用该函数。 节点7.6+更

  • 我有Maven应用程序,具有3个不同的配置文件,如下所示 我有这样的Maven结构: src/main/config/default/WEB-INF/WEB。xml src/main/config/dev/WEB-INF/WEB。xml src/main/config/test/WEB-INF/web.xml src/main/config/prod/WEB-INF/web.xml src/mai

  • 问题内容: 我使用10gen的本机node.js驱动器将mongodb(2.2.2)与node.js一起使用。 起初一切顺利。但是当涉及到并发基准测试部分时,会发生很多错误。频繁进行1000次并发连接/关闭可能会导致mongodb拒绝任何进一步的请求,并出现以下错误: 另外,如果许多客户端在没有显式关闭的情况下关闭,则mongodb将花费几分钟的时间来检测并关闭它们。这也将导致类似的连接问题。(使

  • 我试试看。js与mongodb(2.2.2)一起使用本机节点。js drive by 10gen。 起初一切都很顺利。但在并发基准测试部分,出现了很多错误。频繁连接/关闭1000次并发可能会导致mongodb拒绝任何进一步的请求,错误如下: 此外,如果很多客户端在没有显式关闭的情况下关闭,mongodb需要几分钟来检测并关闭它们。这也会导致类似的连接问题。(使用/var/log/mongodb/m

  • 在OpenAPI/Swagger文件中声明“char”的正确方法是什么?我试过这些..但不起作用 我也很累,但运气不好

  • 问题内容: 假设我要编写以下HQL查询: 将其编写为参数化查询的正确方法是什么,例如 问题答案: 我不确定如何使用位置参数来执行此操作,但是如果可以使用命名参数而不是位置参数,则可以将命名参数放在方括号内,并且可以使用Query接口中的setParameterList方法将值列表绑定到此参数。