Mongodb 4.4.0字段路径字段名不能以开头

Mongodb 4.4.0字段路径字段名不能以开头,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我只是浏览有关mongodb的文档并尝试使用聚合,当我的查询包含{$project:{aw_product_id:1,{ud id:0}节时,我遇到了错误,节$project一切看起来都是正确的,列aw_product_id出现在我的模型中,我尝试更改到另一列,但仍然面临相同的错误。我做错了什么 db.version->4.4.0 nad面临着这个问题 无法执行脚本 Error: command failed: { "ok" : 0, "errmsg

我只是浏览有关mongodb的文档并尝试使用聚合,当我的查询包含{$project:{aw_product_id:1,{ud id:0}节时,我遇到了错误,节$project一切看起来都是正确的,列aw_product_id出现在我的模型中,我尝试更改到另一列,但仍然面临相同的错误。我做错了什么

db.version->4.4.0

nad面临着这个问题

无法执行脚本

Error: command failed: {
    "ok" : 0,
    "errmsg" : "FieldPath field names may not start with '$'.",
    "code" : 16410,
    "codeName" : "Location16410"
} : aggregate failed 
Details:
_getErrorWithCode@src/mongo/shell/utils.js:25:13
doassert@src/mongo/shell/assert.js:18:14
_assertCommandWorked@src/mongo/shell/assert.js:534:17
assert.commandWorked@src/mongo/shell/assert.js:618:16
DB.prototype._runAggregate@src/mongo/shell/db.js:260:9
DBCollection.prototype.aggregate@src/mongo/shell/collection.js:1062:12
DBCollection.prototype.aggregate@:1:355
@(shell):1:1
我对另一个收藏和新收藏也做了同样的操作,但遇到了同样的错误

db.getCollection('AwinProduct').aggregate(
   [
     { $match: { $text: { $search: "Sko Nike Classic Cortez för män -Svart", $language: 'sv'  } } },
     { $sort: { score: { $meta: "textScore" } } },
     { $project: { "currency": 1, _id: 0} }
   ]
)
我尝试对字段使用qoutes,但仍然出现相同的错误

db.getCollection('AwinProduct').aggregate(
   [
     { $match: { $text: { $search: "Sko Nike Classic Cortez för män -Svart", $language: 'sv'  } } },
     { $sort: { score: { $meta: "textScore" } } },
     { $project: { "currency": 1, _id: 0} }
   ]
)
我在docker结构中使用mongo,这是我的docker为这个img编写的

mongodb:
    image: mongo:latest
    container_name: mongodb
    hostname: mongodb
    volumes:
        - ./docker/mongodb/mongod.conf:/etc/mongod.conf
        - ./docker/mongodb/initdb.d/:/docker-entrypoint-initdb.d/
        - ./data/momgo/:/data/db/
        - ./docker/mongodb/data/log/:/var/log/mongodb/
        - ./docker/mongodb/home:/home/mongodb
    env_file:
        - .env
    environment:
        MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}
        MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}
        MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE}
    ports:
        - "27017:27017"
    command: ["-f", "/etc/mongod.conf"]
    networks:
        - php

我面临着同样的问题,我可能有一些解决办法。$sort运算符似乎有问题。试着把它放在$project操作符后面

在我的情况下,以下管道也出现了相同的错误:一个$sort,然后一个$unwind,然后一个$project。如果$sort放在$unwind之后,无论$unwind是否放在$project之后,错误都会消失


我不完全理解这种情况,但当涉及到第三个操作符时,$sort和$project之间似乎存在一些模糊的交互作用。

经过大量研究,我发现下面有一个关于在投影部分中使用的查找和聚合函数的一般说明

{$meta:textScore}表达式可以是投影文档的一部分,以包含文本分数元数据

$meta表达式可以存在于包含投影或排除投影中

如果将表达式设置为文档中已存在的字段名,则投影的元数据值将覆盖现有值

如果在$sort stage之后使用$project stage,则创建文本索引的分数或文本索引字段应为包含或排除

根据您的要求,请尝试以下解决方案:

我不知道文本索引字段名,但我会预测字段名为name

除了per,还有其他方法,我推荐这种方法

交换$project和$sort阶段,
尝试用引号括起AWU产品id。猜测。我觉得这个查询很好。@Gibbs双引号和单引号没用:有些神奇。。。
db.getCollection('AwinProduct').createIndex({ name: "text" });
db.getCollection('AwinProduct').aggregate(
   [
     { $match: { $text: { $search: "Sko Nike Classic Cortez för män -Svart", $language: 'sv'  } } },
     { $sort: { score: { $meta: "textScore" } } },
     { 
       $project: { 
         "_id", "$$REMOVE",
         "name": "$$REMOVE",
         "aw_product_id": 1
     }
   ]
)
db.getCollection('AwinProduct').aggregate(
   [
     { $match: { $text: { $search: "Sko Nike Classic Cortez för män -Svart", $language: 'sv'  } } },
     { $project: { aw_product_id: 1, _id: 0 } },
     { $sort: { score: { $meta: "textScore" } } }
   ]
)