MongoServerError:不能在包含投影中对字段日期进行排除



我正在使用MongoDB Atlas服务器…并且遇到了这个错误…是什么意思?谁能简单地解释一下吗?

这是我正在尝试的查询…

db.posts.find({}, {title: 1, date: 0})

数据库中帖子的结构如下:

[
{
_id: ObjectId("63739044de169f6d0h2e6a3d"),
title: 'Post 2',
body: 'a news post',
category: 'News',
likes: 1,
tags: [ 'news', 'events' ],
date: 'Tue Nov 15 2022 18:53:24 GMT+0530 (India Standard Time)'
},
{
_id: ObjectId("63739271de179f5d0e31e5b2"),
title: 'Post 1',
body: 'hey there, hemant here',
category: 'random',
likes: 1,
tags: [ 'random', 'events' ],
date: 'Tue Nov 15 2022 18:41:24 GMT+0530 (India Standard Time)'
}
]

但是我得到一个错误,说…

MongoServerError: Cannot do exclusion on field date in inclusion projection

我试图获得所有的文档对象,不包括日期参数和包括标题参数,但得到一个错误…

根据文档,find中的第一个参数是filter,第二个参数是projectionprojection允许指定要返回的字段。_id是您需要在投影中明确排除的唯一字段。对于所有其他字段,您只需要说明包含内容。您必须遵循以下格式:

db.posts.find({}, {title: 1, body:1, category:1, likes:1, tags:1})

另一种可能性是

在'posts'猫鼬模式中,如果我们像这样设置日期键

date: {
type: string,
select: true
}

select:true总是在所有查找查询中返回日期键

和传递{date:0}在投影或dot_select(.select)对象将返回这个错误:

不能排除包含投影中的字段日期

这是一个简单的错误,我将向您展示如何修复。你需要了解投影是如何工作的。但首先,让我们看看find()方法是如何工作的。find()方法可以接受两个参数,它们是1。过滤器和2。投影。有两种类型的投影:1。包含投影和2。排除投影。

  1. 包含投影表示指定查询文档结果中要包含的所有字段。这是通过将需要包含在作为find方法第二个参数传递的对象中的所有键值赋值1来实现的。注意,只有"_id">
  2. 在进行包含投影时,可添加排除键。

您可以这样做来对post collection上的title字段执行包含投影:

db.posts.find({}, {"title": 1})

db.posts.find({}, {"title": 1, "_id": 0})

,结果将是:

[
{
title: 'Post 1'
},
{
title: 'Post 2'
}
]
  1. 排除投影表示在查询文档的结果中指定要排除的所有字段。这是通过将在作为find方法的第二个参数传递的对象中排除的所有键值赋值为0来实现的。要使用排除投影获得与上面的包含投影相同的结果,您可以这样做:
db.posts.find({}, {"_id": 0, "body":0, "category":0, "likes":0, "tags":0, "date":0})

,结果将是:

[
{
title: 'Post 1'
},
{
title: 'Post 2'
}
]

感谢您的阅读。我希望这能让你对投影有一个深刻的理解。

这有点晚了,但这里有一些东西可以帮助您获得除日期以外的所有内容:

db.posts.find({}, {date: 0})

最新更新