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

Spring Data MongoTemplate聚合错误“对$filter的输入必须是数组而不是对象”

衡丰茂
2023-03-14

我的文档结构如下:

{
    "_id" : ObjectId("...."),
    "oneMoreId" : "....",
    "items" : [
            {
                    "itemId" : "...",
                    "type" : "Food",
            }
    ]        
}

当我在mongoDB中运行JSON查询:

db.inventory.aggregate([
{$match: { $and: [{"oneMoreId":"..."},{"items.type": "Food"}]}},
{"$project": {
"oneMoreId": 1,
"items": {
    "$filter": {
        "input": "$items",
        "as": "item",
        "cond": {
            "$eq": ["$$item.type", "Food"]
        }
    }
}
}}
])

它工作得非常好。

但当我使用SpringData的MongoTemplate运行聚合时,它会让我

$filter的输入必须是数组而不是对象

这是我的聚合查询(只是投影部分):

ProjectionOperation projection = project("oneMoreId").and(new AggregationExpression() {

@Override
public Document toDocument(AggregationOperationContext context) {
    return new Document("$filter", new Document(
                  "input", "$items")
                  .append("as","item")
                  .append("cond", new Document("$eq", Arrays.asList("$$item.type","Food")))
              );
}
}).as("items");

我在控制台中打印出来,查询与上面的JSON查询完全相同。准确的我甚至尝试过纯Spring数据的查询:

ProjectionOperation projection = project("oneMoreId")
    .and(filter("items")
            .as("item")
            .by(valueOf("item.type")
                    .equalToValue("Food"))).as("items");

同样,同样的错误(即使打印它会导致上面相同的JSON查询)。保存项的java对象是一个列表。我将其更改为仅使用数组项[],但它仍然不起作用。

任何帮助将不胜感激。

共有1个答案

樊运乾
2023-03-14

没有关系,

有人(我)错误地以对象的形式而不是数组的形式放入一个项目。那搞砸了一切。刚刚删除了整个记录,一切正常。

 类似资料:
  • 问题内容: 我正在努力使机器人围绕8 x 8的2d网格室移动,其中一部分正在初始化传感器,该传感器由围绕机器人的最近5个瓦片组成。 在这里,我创建了一个由5个元素组成的数组。 但是当我尝试像这样设置传感器的值时: 我得到“列表索引必须是整数,而不是元组”的错误。 问题答案: 您说的是一个“二维网格”-我假设它是一个列表列表。在这种情况下,您应该以以下方式访问其元素 而不是用该对索引外部列表。

  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • 问题内容: 我一直在尝试更新一个名为libpynexmo的小型Python库以与Python 3一起使用。 我一直坚持这个功能: 遇到这个问题时,json会回应: 我在一些地方读到,应该为您传递带有附件的对象(在这种情况下为对象),但是它不适用于对象。 我不知道下一步该怎么做,但是由于我的整个1500行脚本是新转换为Python 3的,所以我不想回到2.7。 问题答案: 我最近写了一个小功能来发送

  • 我将脚本中工作的 jsonschema 转换为 YAML 格式,以便使用 swagger 文档。问题是在第8行(-type:字符串)中,swagger显示错误:应该是对象,“项目”必须是对象。 Json模式

  • 我正在使用pygame创建一个游戏,但遇到了一个错误,我是pygame的新手。我正在使用python 3.8和pycharm社区版2020.1 这是我制作游戏的视频:https://www.youtube.com/watch?v=FfWpgLFMI7w这里是错误: 这是我的密码:

  • 我学习Python才几个星期,这个问题难倒了我。我试图创建一个简单的塔防风格的游戏使用Pyplay。已经在谷歌上搜索和研究了4个多小时(pyplay docs网站在发布时已经关闭,依赖于缓存版本)。我相信它最终会变得非常容易修复,但我没有主意了。 我把塔类放在一个文件中,主游戏循环放在另一个文件中。图像文件存储在名为“资产”的文件夹中,该文件夹与tower类和主游戏循环位于同一目录中。当我试图创建