如何使用Node.JS在MongoDB中正确实现过滤器和/或投影

bakd9h0s  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(227)

我在一个名为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 IDfirst namelast nameusername的查询,其中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;任何形式的帮助都将受到赞赏。

mbzjlibv

mbzjlibv1#

总的来说,我认为我们需要更多的调试细节。
假设在第一次尝试中username变量被设置为字符串'Tuser',它甚至不会运行,因为它混淆了“包含”和“排除”投影。你可以看到this playground example中的错误。
我们不知道你第二次尝试的filter变量是什么。如果我假设它类似于{ username: 'Tuser' },那么它也会因为格式错误的投影而失败。你可以在this playground example中看到。
你确定你共享的(重新编译的?)代码/查询是发送到数据库的吗?
在任何情况下,你需要做一个包含投影,同时也抑制_id字段。这需要从你的投影中删除最后两行,例如:

db.collection.find({
  "username": "Tuser"
},
{
  "_id": 0,
  "customer_id": 1,
  "first_name": 1,
  "last_name": 1,
  "username": 1
})

字符串
当您对包含这两个文档集合运行查询时:

[
  {
    _id: ObjectId("652edd74bdb84c9944d280d6"),
    customer_id: 1001,
    first_name: "Test",
    last_name: "User",
    username: "Tuser",
    password: "Testuser",
    registration_date: new Date("2023-10-17T13:54:54.000Z")
  },
  {
    username: "other"
  }
]


输出为:

[
  {
    "customer_id": 1001,
    "first_name": "Test",
    "last_name": "User",
    "username": "Tuser"
  }
]


这似乎是你所要求的。看看它在this playground example中是如何工作的。

相关问题