嵌套文档中的数组无法读取(Nodejs)
嵌套文档中的数组无法读取(Nodejs)
文档中的pages无法读取。 存储: var pageListSchema = new Schema({ _pid:String, name:String, eName:String, pages:[{name:String,id:String,type:String}] }); var pageList = db.model(‘pageList’,pageListSchema); var p = new pageList({_pid:getId,name:getName,eName:getEName,pages:[{name:“html”,id:“0”,type:“0”}]}); p.save(); 读取: pageList.find({pages:[{id:“0”}]},function(err,data){ console.log(data); }); pageList.find({pages:{$elemMatch:{id:“0”}}},function(err,data){ console.log(data); }); 尝试用了以上两种方法都无法取出,返回的是 [ { _pid: '510a3e793f30c5980f000001’ name: ‘cc’, eName: ‘cc’, _id: 510a3e803f30c5980f000002, __v: 0, pages: [ ‘[object Object]’ ] } ] 这是为什么,请指教
当在MongoDB中使用嵌套文档时,查询条件需要正确地匹配嵌套结构。在你的例子中,问题可能出在如何正确地查询嵌套数组中的元素。以下是正确的处理方式:
存储数据
首先,确保你在创建和保存数据时没有错误。你的代码看起来是正确的,但为了清晰起见,我将重新组织一下:
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true, useUnifiedTopology: true });
const pageListSchema = new mongoose.Schema({
_pid: String,
name: String,
eName: String,
pages: [{ name: String, id: String, type: String }]
});
const PageList = mongoose.model('PageList', pageListSchema);
// 创建并保存数据
const getId = '510a3e793f30c5980f000001';
const getName = 'cc';
const getEName = 'cc';
const p = new PageList({
_pid: getId,
name: getName,
eName: getEName,
pages: [{ name: "html", id: "0", type: "0" }]
});
p.save((err) => {
if (err) console.error(err);
else console.log('Document saved successfully');
});
查询数据
当你查询嵌套数组中的元素时,你需要使用 $elemMatch
操作符来匹配嵌套对象中的属性。你已经在代码中尝试过这种方法,但让我们再次确认一下:
PageList.find(
{ pages: { $elemMatch: { id: "0" } } },
(err, data) => {
if (err) console.error(err);
else console.log(data);
}
);
解释
- $elemMatch: 这个操作符允许你指定多个条件来匹配数组中的元素。例如,如果你想找到
pages
数组中包含特定id
的文档,你可以使用$elemMatch
。
常见问题
- 确保你的查询条件与数据结构匹配。如果你只写
{ pages: { id: "0" } }
,这不会匹配嵌套数组中的对象。 - 确保数据已成功保存到数据库中,并且你正在查询正确的集合。
通过上述步骤,你应该能够正确地从嵌套文档中读取数组。如果仍然遇到问题,请检查数据库中的实际数据是否符合预期的格式。
居然无法再编辑,把之前的代码高亮一下
var pageListSchema = new Schema({
pid:String,
name:String,
eName:String,
pages:[{name:String,id:String,type:String}]
});
var pageList = db.model('pageList',pageListSchema);
var p = new pageList({pid:getId,name:getName,eName:getEName,pages:[{name:"html",id:"0",type:"0"}]});
p.save();
读取:
pageList.find({pages:[{id:"0"}]},function(err,data){
console.log(data);
});
pageList.find({pages:{$elemMatch:{id:"0"}}},function(err,data){
console.log(data);
});
结果:
[ { _pid: '510a3e793f30c5980f000001'
name: 'cc',
eName: 'cc',
_id: 510a3e803f30c5980f000002,
__v: 0,
pages: [ '[object Object]' ] } ]
结果应该是对的,你在使用data.pages的时候应该就能得到你想要的结果。 另外如果你是使用的sub-doc结构,可以使用parent.children.id(id)来查找,api上应该都有的
你遇到的问题是因为在存储和查询嵌套文档时使用了错误的方式。具体来说,在存储时,pages
数组中的对象被转换为 [object Object]
字符串形式,而不是一个有效的 JSON 对象。
示例代码
存储数据
const mongoose = require('mongoose');
// 定义 Schema
const pageListSchema = new mongoose.Schema({
_pid: String,
name: String,
eName: String,
pages: [{ name: String, id: String, type: String }]
});
// 创建模型
const PageList = mongoose.model('pageList', pageListSchema);
// 存储数据
async function savePage() {
const p = new PageList({
_pid: getId(),
name: getName(),
eName: getEName(),
pages: [
{ name: "html", id: "0", type: "0" }
]
});
await p.save();
console.log("Data saved successfully.");
}
savePage().catch(console.error);
查询数据
// 查询数据
async function findPages() {
try {
const result = await PageList.find({
pages: { $elemMatch: { id: "0" } }
}).exec();
console.log(result);
} catch (error) {
console.error(error);
}
}
findPages().catch(console.error);
解释
-
存储数据:
- 确保
pages
数组中的对象是直接的对象而不是字符串形式。这样可以确保它们在存储时不会被转换为[object Object]
。
- 确保
-
查询数据:
- 使用
$elemMatch
来查询嵌套数组中的元素。$elemMatch
可以匹配数组中的特定条件。
- 使用
注意事项
- 确保在存储和查询数据时都使用相同的结构,避免类型转换问题。
- 在存储和查询时都使用 Mongoose 的 API 可以避免一些常见的问题。
通过以上示例代码,你应该能够正确地存储和查询嵌套文档中的数组。