如何测试mongodb子文档中数组的每个元素

如何测试mongodb子文档中数组的每个元素,mongodb,mongodb-query,pymongo,Mongodb,Mongodb Query,Pymongo,我拥有mongodb文档,其中包含以下数据: amenities[ { amenity_id:52, Amenity:"AC" }, { amenity_id:23, Amenity:"Free Parking" } ] 我想将数组的每个舒适性\u id元素与特定值匹配,并使用条件$cond返回true或false。我曾经 "$project":{'Free Parking':{'$cond':{'if':{'$in':['amenities.ameni

我拥有mongodb文档,其中包含以下数据:

    amenities[
{
    amenity_id:52,
    Amenity:"AC"
},
{
    amenity_id:23,
    Amenity:"Free Parking"
}
]
我想将数组的每个
舒适性\u id
元素与特定值匹配,并使用条件
$cond
返回true或false。我曾经

"$project":{'Free Parking':{'$cond':{'if':{'$in':['amenities.amenityId',[23]]},'then':'True','else':'False'}}
如果文档包含
amentity\u id=52
,则查询必须返回False。
无论menityId是什么,它都返回false。因此,可以在中使用
$列出设施Id。如何测试每个元素?

考虑到您的输入集合是

[
  {
    amenities: [
      {
        _id: 52,
        Amenity: "AC"
      },
      {
        _id: 23,
        Amenity: "Free Parking"
      }
    ]
  }
]
使用聚合管道$map

db.collection.aggregate([
  {
    $project: {
      amenites: {
        $map: {
          input: "$amenities",
          as: "item",
          in: {
            Amenity: "$$item.Amenity",
            _id: "$$item._id",
            isValid: {
              $cond: {
                if: {
                  $eq: [
                    "$$item._id",
                    23
                  ]
                },
                then: true,
                else: false
              },

            }
          }
        }
      }
    }
  }
])
您将得到以下结果:

[
  {
    "amenites": [
      {
        "Amenity": "AC",
        "_id": 52,
        "isValid": false
      },
      {
        "Amenity": "Free Parking",
        "_id": 23,
        "isValid": true
      }
    ]
  }
]

在mongodb中使用$unwind操作,它会将数组字段展开到多个文档中

请参考以下网址-

例:

将使用$unwind将其转换为以下内容:

[
    {_id, field:1},
    {_id, field:2},
    {_id, field:3}
]
$unwind
之后,您可以使用
$in
查询运行匹配查询

例:


我能够通过在一个阶段收集所有id并在下一阶段将值与列表进行比较来解决这个问题。您是否查询符合条件的文档?还是做别的什么?使用$all可以在一个数组中找到满足多个条件的文档。为什么在一个位置有
\u id
,但在代码中测试
修正id
?我的错。我现在已经更新了问题。你仍然在一个地方有
amentityid
,在另一个地方有
amentity\u id
。我想知道这是否是您的问题的核心,但如果它起作用,我猜它在您的代码中是正确的,而在示例代码或文档中是不正确的。展开是不必要的,它现在会破坏原始文档。@AsyaKamsky聚合查询不会修改任何原始文档,而且它不会发生,您能告诉我有关您遇到的问题的更多详细信息吗?关键是,当您使用$unwind时,聚合管道会更改文档的数量及其形状(在管道中)——因此,在$unwind之后,无论您想对它们做什么,都会使用不同于存储在集合中的文档的操作。我不是说它对磁盘上的文档有任何作用,但是当问题是“如何为X测试文档”时,更改文档将不再返回他们想要测试的原始文档。
[
    {_id, field:1},
    {_id, field:2},
    {_id, field:3}
]
{
 $match: {
   field: {$in: [1,2]} 
 }
}