查询 mongodb 嵌套对象
Querying mongodb for a nested object
我的 mongoDb 中有 Book
个对象,看起来像这样(非常简单):
{
"_id": ObjectId("620e341dbf575892d9396dc2"),
"title": "my title",
"author": {
"_id": ObjectId("620e341dbf575892d9396dd4"),
"surname": "My surname"
}
}
我正在尝试查询并获取某个作者的所有书籍,到目前为止我已经尝试过:
const booksByAuthor = await Book.find({ author: { _id: "620e341dbf575892d9396dd4" } });
和
const booksByAuthor = await Book.find({ 'author._id': "620e341dbf575892d9396dd4" } );
但在任何情况下我都不会从给定的作者那里得到现有的书籍,而且我只会得到空数组。
我做错了什么?
第一次查询的问题:
当您想在嵌套字段中查询时,您必须像在第二个查询中那样使用 dot notation。
不使用点符号的问题是 mongo 匹配整个对象(甚至字段顺序)所以不是一个好方法......你可以检查简单的例子,如:
- This one:找到对象,因为对象一模一样
- Another this one 其中对象具有来自集合中两个对象的相同字段和值,但是...使用顺序重要的对象进行查询,因此只有 returns 一个。
第二次查询的问题:
我认为这里的问题是你在匹配 string
与 ObjectId
。语法是正确的(点符号)但是当 mondo 匹配值时,其中一个是字符串,另一个是 ObjectId。
所以你可以试试这个查询:
const booksByAuthor = await Book.find({ 'author._id': mongoose.Types.ObjectId("620e341dbf575892d9396dd4") } );
勾选this example with your query, matching string and ObjectId none result is returned, but parsing string to ObjectId... magic appears
我的 mongoDb 中有 Book
个对象,看起来像这样(非常简单):
{
"_id": ObjectId("620e341dbf575892d9396dc2"),
"title": "my title",
"author": {
"_id": ObjectId("620e341dbf575892d9396dd4"),
"surname": "My surname"
}
}
我正在尝试查询并获取某个作者的所有书籍,到目前为止我已经尝试过:
const booksByAuthor = await Book.find({ author: { _id: "620e341dbf575892d9396dd4" } });
和
const booksByAuthor = await Book.find({ 'author._id': "620e341dbf575892d9396dd4" } );
但在任何情况下我都不会从给定的作者那里得到现有的书籍,而且我只会得到空数组。
我做错了什么?
第一次查询的问题:
当您想在嵌套字段中查询时,您必须像在第二个查询中那样使用 dot notation。
不使用点符号的问题是 mongo 匹配整个对象(甚至字段顺序)所以不是一个好方法......你可以检查简单的例子,如:
- This one:找到对象,因为对象一模一样
- Another this one 其中对象具有来自集合中两个对象的相同字段和值,但是...使用顺序重要的对象进行查询,因此只有 returns 一个。
第二次查询的问题:
我认为这里的问题是你在匹配 string
与 ObjectId
。语法是正确的(点符号)但是当 mondo 匹配值时,其中一个是字符串,另一个是 ObjectId。
所以你可以试试这个查询:
const booksByAuthor = await Book.find({ 'author._id': mongoose.Types.ObjectId("620e341dbf575892d9396dd4") } );
勾选this example with your query, matching string and ObjectId none result is returned, but parsing string to ObjectId... magic appears