我只是浏览有关mongodb的文档,并且尝试使用聚合,并且当我的查询包含{ $project: { aw_product_id: 1, _id: 0} }
部分时,我遇到了错误,部分$project
似乎都正确,模型中的列aw_product_id
,我尝试更改为另一列,但仍然遇到相同的错误。我在做什么错了?
db.version() -> 4.4.0
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} }
]
)
面对这个问题
无法执行脚本。
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,但仍然存在相同的错误
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
答案 0 :(得分:2)
经过大量研究,我在投影中的使用部分下找到了以下关于查找和聚合函数text-score-metadata-meta-textscore的一般说明,
<块引用>{ $meta: "textScore" }
表达式可以是投影文档的一部分,以包含文本分数元数据。
$meta
表达式可以出现在包含或排除投影中。
如果您将表达式设置为文档中已存在的字段名称,则投影的元数据值将覆盖现有值。
上面加粗的句子清除了,如果你在$project
阶段之后使用$sort
阶段,你创建的文本索引的score
或文本索引字段应该包含或排除,
根据您尝试的解决方案:
我没有文本索引字段名称,但我将字段名称预测为 name
,
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
}
]
)
除了@Alexandre Masseron的answer之外,还有其他方式,我会推荐这种方式
$project
和 $sort
阶段,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" } } }
]
)
答案 1 :(得分:0)
我遇到了同样的问题,可能需要一些解决方案。 $ sort运算符似乎有问题。尝试将其放在$ project运算符之后。
在我的情况下,以下管道存在相同的错误:$ sort,然后$ unwind,然后是$ project。如果将$ sort放在$ unwind之后,无论$ unwind放在$ project之后,错误都会消失。
我不完全了解这种情况,但是当涉及到第三个运算符时,似乎$ sort和$ project之间存在一些晦涩的交互。