首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于数组字段的Mongodb查找查询

基于数组字段的Mongodb查找查询
EN

Stack Overflow用户
提问于 2020-05-27 14:25:12
回答 3查看 385关注 0票数 1

集合:

代码语言:javascript
运行
复制
{
         "_id" : ObjectId("57506d74c469888f0d631be6"),
         "name" : "mycollection",
         "details" : [ 
             {
                 "date" : "25/03/2020",
                 "number" : "A",
                 "active" : false
              }
        },
{
        "_id" : ObjectId("57506d74c469888f0d631usi"),
        "name" : "newcollection",
        "details" : [ 

            {
                "date" : "30/03/2020",
                "number" : "C",
                "active" : false
            } 
        },
{
        "_id" : ObjectId("57506d74c4633388f0d631usi"),
        "name" : "mycollection",
        "details" : [ 

            {
                "date" : "31/03/2020",
                "number" : "C",
                "active" : false
            }
        },
    }

根据details字段中的活动状态获取值的查找查询。

我试过:

代码语言:javascript
运行
复制
db.collection.find(
    {"name": "mycollection", "details": {"active": False}})

预期结果:在每个集合中的details字段下,我需要活动为false的集合。这里应该显示记录id ObjectId("57506d74c469888f0d631be6")和ObjectId("57506d74c4633388f0d631usi")。

EN

回答 3

Stack Overflow用户

发布于 2020-05-27 15:50:19

如果details数组可能有一些具有active = true的对象,一些对象= false,而且您只需要获得具有active =false的对象,那么我们可以使用聚合管道中的$filter来过滤细节数组

你的疑问也许是这样的

代码语言:javascript
运行
复制
db.collection.aggregate([
  {
    $match: {
      name: "mycollection",
      "details.active": false
    }
  },
  {
    $project: {
      name: 1,
      details: {
        $filter: {
          input: "$details",
          as: "elem",
          cond: {
            $eq: ["$$elem.active", false]
          }
        }
      }
    }
  }
])

你可以在这里测试一下

希望它能帮上忙

票数 2
EN

Stack Overflow用户

发布于 2020-05-27 14:38:12

文档包含关于这种类型的查询的一节:https://docs.mongodb.com/manual/tutorial/query-array-of-documents/

您的查询不起作用,因为这种语法要求数组包含确切的对象,但是数组中的文档包含额外的字段,因此没有匹配。

本例的查询是db.collection.find({"name": "mycollection", "details.active": False})

注意:这将返回数组包含带有active==false的对象的所有文档,但是它不会过滤实际的数组来删除active=true的任何元素。

票数 1
EN

Stack Overflow用户

发布于 2020-05-27 15:10:01

对mongodb或robomongo的查询与在您的示例中find()可能工作相同,但我选择了可以筛选值的聚合。

示例查询:

代码语言:javascript
运行
复制
db.getCollection('collection').aggregate([{$match: {'details.active': {$ne: true},"name":"mycollection"}}]) 

很简单。但请确认并回复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62045507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档