【问题标题】:[pymongo]: Find items in array of objects[pymongo]:在对象数组中查找项目
【发布时间】:2022-01-15 21:16:08
【问题描述】:

这是我想从中获取列表中所有 child.item('Toy1'、'Toy2' 等)的文档之一。

{
    _id: 'Toy',
    name: 'Toyname',
    child: [
      { item: 'Toy1', isActive: '1', Type: 'New' },
      { item: 'Toy2', isActive: '2', Type: 'Old' }
    ]
  }

我试过了

pipeline = [
   {
      "$match": {
         "_id": "Toy",
         "child.isActive": '1'
      }
   },
   {
      "$unwind":
         "$child"
    },
]
list(DB.Category.aggregate(pipeline))
[{'_id': 'Toy', 'name': 'Toyname', 'child': {'item': 'Toy1', 'isActive': 1, 'Type': 'New'}}, {'_id': 'Toy', 'name': 'Toyname', 'child': {'item': 'Toy2', 'isActive': 2,
'Type': 'Old'}}]

并在 dbshel​​l 上尝试过这个

#> db.Category.find({name:"Toyname",child:{$elemMatch:{Type:"New"} }})
[
  {
    _id: 'Toy',
    name: 'Toyname',
    child: [
      { item: 'Toy1', isActive: '1', Type: 'New' },
      { item: 'Toy2', isActive: '2', Type: 'Old' }
    ]
  }
]

但正如您所见,它为我提供了数组中的两个项目。我正在使用 pymongo 4.0.1。

期望列表为 o/p 满足匹配条件,如 $match 中的 Type:'New' 应返回 'Toy1',isActive:'2' 应返回 'Toy2'。 我希望我能够清楚地提出我的要求。

【问题讨论】:

  • 如果您以 JSON 格式发布预期结果会很有帮助。
  • 我想要列表中所有属于 Type:'new' 或 isActive:'1' 的项目。
  • 看重复的问题,How to filter array in subdocument with MongoDB,可以使用$filter表达式操作符,条件使用$and操作符。

标签: mongodb pymongo


【解决方案1】:

你有两个选择:

  1. find 查询中使用$elemMatch。 (注意$elemMatch 只返回数组中的一个对象)

你可以使用这个查询:

db.collection.find({
  "_id": "Toy"
},
{
  "child": {
    "$elemMatch": {
      "isActive": "1"
    }
  }
})

示例 [https://mongoplayground.net/p/du7FTnvlW7C]

还要检查this example,其中有两个isActive: "1",并且只返回一个。

  1. 在聚合查询中使用$filter(您也可以同时使用$match$unwind$group,但我认为使用$filter 是更好的方法)。

所以使用aggregate 你可以试试这个查询:

db.collection.aggregate([
  {
    "$match": {
      "_id": "Toy"
    }
  },
  {
    "$addFields": {
      "child": {
        "$filter": {
          "input": "$child",
          "as": "c",
          "cond": {
            "$eq": ["$$c.isActive","1"]
          }
        }
      }
    }
  }
])

例如here

而使用$unwind,你需要this query,我认为这太重了:两个$match、一个$unwind和一个$group...当你只能使用$filter时。

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2020-08-09
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2018-09-18
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多