从 mongodb 检索数据时排除某些数据无效

excluding some data while retrieving data from mongodb is not working

我正在使用 mongodb nodejs 驱动程序。

const res = await chats.findOne({ _id: chatId }, { messages: 0, _id: 0 });

这就是我得到的回应,我不想在收到的数据上得到 messages_id 属性

{
      "_id": "d0fff742-4af5-4e6a-bd51-9aa47da08fb9",
      "messages": "ea678ca7-81fb-479b-89f8-7995d8831992",
      "lastMessage": {
        "content": "Hey, how's it?",
        "sender": "urtheaman"
      }
    }
  }

collection.find(query, options) $slice 也不起作用。我认为整个选项参数都不起作用。

const res = await messages.findOne(
      { _id: messagesId },
      { messages: { $slice: [from, 15] }, _id: 0 }
    );

您应该取回整个文档,然后拥有您自己的函数以对您有用的方式处理该数据。

你可以

function getLastMEssage (data){
    return data.lastMessage.content
}

尝试使用:

const res = await chats.findOne({ _id: chatId }, { messages: 1, _id: 1 });

如果你想要一个字段,确保它是另一个 0。

文档说

您可以指定要包含的字段或要保留的字段,但不能同时指定。例如,以下投影是无效的,因为它同时包含名称字段并保留地址字段

// Invalid
// Can't simultaneously include and withhold
{ "name": 1, "address": 0 }
// Valid
// Can exclude _id while including other fields
{ "_id": 0, "name": 1 }

我只是一次预扣,没有同时做但还是不行。

你应该像这样使用投影:

var cursor = client
    .db('so')
    .collection('sample')
    .find()
    .project({ _id: 0, messages: 0 });

await cursor.forEach(console.dir); 
// { lastMessage: { content: "Hey, how's it?", sender: 'urtheaman' } }

您可以看到完整的示例可运行文件here

此外,我建议您应该使用 mongoose 而不是 mongo 节点驱动程序以获得更好的开发体验。