首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongodb 4.4.0 FieldPath字段名称不能以

Mongodb 4.4.0 FieldPath字段名称不能以
EN

Stack Overflow用户
提问于 2020-08-07 15:08:35
回答 2查看 5.6K关注 0票数 3

我只是浏览关于mongodb的文档,只是尝试使用聚合,当我的查询包含{ $project: { aw_product_id: 1, _id: 0} }节I got,节$project一切看起来都正确,列aw_product_id存在于我的模型中,我尝试更改到另一个列,但仍然面临相同的错误。我哪里做错了?

db.version() -> 4.4.0

代码语言:javascript
复制
db.getCollection('AwinProduct').aggregate(
   [
     { $match: { $text: { $search: "Sko Nike Classic Cortez för män -Svart", $language: 'sv'  } } },
     { $sort: { score: { $meta: "textScore" } } },
     { $project: { aw_product_id: 1, _id: 0} }
   ]
)

nad面对这一点

无法执行脚本。

代码语言:javascript
复制
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

我对另一个集合和新集合执行了相同的操作,但遇到了相同的错误

我尝试对字段使用qoutes,但仍然出现相同的错误

代码语言:javascript
复制
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-compose for this img

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2020-12-18 19:13:58

我遇到了同样的问题,我可能有一些解决方案的要素。$sort运算符似乎有问题。试着把它放在你的$project操作符后面。

在我的情况下,下面的管道也有同样的错误:先是$sort,然后是$unwind,然后是$project。如果将$sort放在$unwind之后,则无论$unwind是否放在$project之后,错误都会消失。

我不完全理解这种情况,但当涉及到第三个运算符时,看起来$sort和$project之间存在一些模糊的交互。

票数 2
EN

Stack Overflow用户

发布于 2021-03-07 17:30:30

经过大量的研究,我在Projection中的Usage部分找到了关于查找和聚合函数text-score-metadata-meta-textscore的一般说明。

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

$meta $meta表达式既可以出现在包含投影中,也可以出现在排除投影中。

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

在粗体句子clears上方,如果在$sort stage之后使用$project stage您创建的文本索引的score或文本索引字段应该是inclusion或exclusion

根据您的尝试解决方案:

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

代码语言:javascript
复制
db.getCollection('AwinProduct').createIndex({ name: "text" });
代码语言:javascript
复制
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
     }
   ]
)

除了根据@Alexandre Masseronanswer还有其他的方法,我会推荐这种方法

  • 交换$project$sort阶段,

代码语言:javascript
复制
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" } } }
   ]
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63296885

复制
相关文章

相似问题

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