NodeJS 嵌套域上的 Mongoose 投影

wj8zmpe1  于 2023-06-29  发布在  Node.js
关注(0)|答案(1)|浏览(136)

我尝试在嵌套字段上进行投影,但它检索的是整个字段,而不是嵌套的type属性:
用户文档中的嵌套字段:

const type=await User.findOne({email: enteredEmail}).select({_id:0, 'accountType.type':1})
console.log(type)

输出:

{ accountType: { type: 'social_account' } }

如何修改查询以检索:'social_account'而不是整个AccountType属性?

0wi1tuuw

0wi1tuuw1#

使用聚合$project运算符将字段从嵌入文档投影到顶层文档。

import mongoose from 'mongoose';
import { config } from '../../config';

mongoose.set('debug', true);

const userSchema = new mongoose.Schema({
    email: String,
    accountType: {
        type: {
            type: String,
        },
    },
});
const User = mongoose.model('user', userSchema);

(async function main() {
    try {
        await mongoose.connect(config.MONGODB_URI);
        await User.collection.drop();
        // seed
        await User.create({ email: 'nick@gmail.com', accountType: { type: 'social_account' } });

        //test
        const r = await User.aggregate()
            .match({ email: 'nick@gmail.com' })
            .project({ type: '$accountType.type', email: 1, _id: 0 })
            .exec();
        console.log(r);
    } catch (error) {
        console.error(error);
    } finally {
        await mongoose.connection.close();
    }
})();

调试日志:

Mongoose: users.drop()
Mongoose: users.insertOne({ email: 'nick@gmail.com', accountType: { type: 'social_account' }, _id: ObjectId("649c2b69fdb39ffcc3c31854"), __v: 0}, {})
Mongoose: users.aggregate([ { '$match': { email: 'nick@gmail.com' } }, { '$project': { type: '$accountType.type', email: 1, _id: 0 } }], {})
[ { email: 'nick@gmail.com', type: 'social_account' } ]

相关问题