我在一个名为user_records
的集合(表)中有一个非常简单的文档(行)结构,如下所示:
[
{
_id: new ObjectId("652edd74bdb84c9944d280d6"),
customer_id: 1001,
first_name: 'Test',
last_name: 'User',
username: 'Tuser',
password: 'Testuser',
registration_date: 2023-10-17T13:54:54.000Z
}
]
字符串
我想运行一个只返回customer ID
、first name
、last name
和username
的查询,其中username
= username
。然而,我尝试过的所有查询都只返回完整的文档(行)。
我的第一次尝试是这个,主要受到MongoDB Compass AI的启发:
1.我为查询定义了过滤器和投影参数:
// Define query parameters
const filter = { 'username': username };
const projections = {
'_id': 0,
'customer_id': 1,
'first_name': 1,
'last_name': 1,
'username': 1,
'password': 0,
'registration_date': 0
};
型
1.我构建了查询:
const customersCollection = client.db('customer_data').collection('user_records');
const customer = await customersCollection.find(filter, projections).toArray();
型
为了让它发挥作用,我还尝试了一些修改:
- 从投影对象的关键点中删除
''
。 - 将
projections
作为对象传递给.find
。就像.find(filter, { projections })
一样。 - 使用
findOne
代替。
以上都不起作用。
我的第二次尝试更加复杂。我没有定义projections
对象,而是这样做:
const customersCollection = client.db('customer_data').collection('user_records');
const customer = await customersCollection.aggregate([
{ $match: filter },
{
$project: {
'_id': 0,
'customer_id': 1,
'first_name': 1,
'last_name': 1,
'username': 1,
'password': 0,
'registration_date': 0
}
}
]).toArray();
型
这没有返回任何东西。
在所有这些中,我只是想让customer
来保存这个:
[
{
customer_id: 1001,
first_name: 'Test',
last_name: 'User',
username: 'Tuser',
}
]
型
我几天前才开始使用MongoDB,来自MySQL;任何形式的帮助都将受到赞赏。
1条答案
按热度按时间mbzjlibv1#
总的来说,我认为我们需要更多的调试细节。
假设在第一次尝试中
username
变量被设置为字符串'Tuser'
,它甚至不会运行,因为它混淆了“包含”和“排除”投影。你可以看到this playground example中的错误。我们不知道你第二次尝试的
filter
变量是什么。如果我假设它类似于{ username: 'Tuser' }
,那么它也会因为格式错误的投影而失败。你可以在this playground example中看到。你确定你共享的(重新编译的?)代码/查询是发送到数据库的吗?
在任何情况下,你需要做一个包含投影,同时也抑制
_id
字段。这需要从你的投影中删除最后两行,例如:字符串
当您对包含这两个文档集合运行查询时:
型
输出为:
型
这似乎是你所要求的。看看它在this playground example中是如何工作的。