嵌套文档中的数组无法读取(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]’ ] } ] 这是为什么,请指教


4 回复

当在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);

解释

  1. 存储数据

    • 确保 pages 数组中的对象是直接的对象而不是字符串形式。这样可以确保它们在存储时不会被转换为 [object Object]
  2. 查询数据

    • 使用 $elemMatch 来查询嵌套数组中的元素。$elemMatch 可以匹配数组中的特定条件。

注意事项

  • 确保在存储和查询数据时都使用相同的结构,避免类型转换问题。
  • 在存储和查询时都使用 Mongoose 的 API 可以避免一些常见的问题。

通过以上示例代码,你应该能够正确地存储和查询嵌套文档中的数组。

回到顶部