标签: mongoose-populate

Mongoose.js - 人口和其他领域?

我想添加一些额外的数据的usermodelwatchedMovies,我有以下模式:

let userSchema = new Schema({
  watchedMovies: [{
    type: Schema.Types.ObjectId,
    ref: 'Movie'
  }]
})
Run Code Online (Sandbox Code Playgroud)

和:

let movieSchema = new Schema({
  title: String
})
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以向watchedMovies对象添加任何其他字段并将其与ObjectId一起存储?我想添加watchedAt date所以当我填充watchedMovies时,UserModel.find().populate('watchedMovies', 'title').exec(...)我会得到类似的东西:

{
  _id: ObjectId(UserId),
  watchedMovies: [{
    _id: ObjectId(...),
    title: 'Some title',
    watchedAt: TimeStamp
  }]
}
Run Code Online (Sandbox Code Playgroud)

watchedAt属性指定何时(Date对象)引用添加到UserModel

是否有可能与猫鼬,我应该如何更改我的架构?

谢谢

mongoose mongodb node.js mongoose-populate

4
推荐指数
1
解决办法
1027
查看次数

数组模型上的Mongoose,Deep Population

我想深入填充一个可能过于复杂的模型

var ParentSchema = new Schema({
  childs: [{type:Schema.ObjectId, ref: 'Child'}],
});

var ChildSchema = new Schema({
    subject: [{
        price: {type: Number},
        data: {type: Schema.ObjectId, ref: 'Subject'}
    }]
})
Run Code Online (Sandbox Code Playgroud)

但是,当我使用常规人口时,它似乎不起作用.我现在安装了deep-populate并使用以下内容:

Parent.deepPopulate('childs.subjects');
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更简单的方法来完成一系列人物.

mongoose mongodb node.js mongoose-populate

4
推荐指数
1
解决办法
3672
查看次数

find(...).populate 不是猫鼬中的函数

我正在尝试在 mongoose 和 node 中填充两个表,但收到填充不是函数的错误。

我有搜索,在文档中它似乎和我做的一样。

这里的模型:

var mongoose = require('mongoose');
var dodleSchema = new mongoose.Schema({
    name: String,
    productorId: {type: mongoose.Schema.ObjectId, ref: "Productor"},
    description: String,
    ambassadorId: {type: mongoose.Schema.ObjectId, ref: "Ambassador"},
    accepted: { type: Boolean, default: false },
    read: { type: Boolean, default: false },
    deliveryAddress: {
        lat: String,
        lng: String
    },
    createdAt: Date,
    products: [
        {
            primaryImage: String,
            images: [],
            name: String,
            max: Number,
            min: Number,
            step: Number,
            stock: Number,
            normalPrice: Number,
            doodlePrice: Number,
            freeShipping: Boolean,
            freeShippingFrom: Number
        }
    ], …
Run Code Online (Sandbox Code Playgroud)

populate mongoose mongodb node.js mongoose-populate

4
推荐指数
1
解决办法
7740
查看次数

Mongoose 填充子文档数组

抱歉,如果已经有人问过这个问题,我的搜索没有出现同样的情况。我有两个架构,如下所示:

var experimentSchema = new mongoose.Schema({

    name  : 'string'
    elements :  [{
        type : mongoose.Schema.ObjectId, 
        ref: 'Element'
    }],
    resources : [{
        type : mongoose.Schema.ObjectId,
        ref  : 'Resource'
    }],

})


var elementSchema = new mongoose.Schema({
    name : 'string',
    component : {
        type : mongoose.Schema.ObjectId,
        ref  : 'Component'
    }
})
Run Code Online (Sandbox Code Playgroud)

我想执行深度填充,以便当我请求实验时,我得到一个带有 和 数组的对象,elements并且resources对于每个元素,该字段component也已填充。

我尝试了一些方法:

Experiment.findOne(query).populate(['resources','elements','elements.component']).exec(...)
Run Code Online (Sandbox Code Playgroud)

没有成功。谁能提供此类操作的正确语法?

提前致谢!

mongoose mongodb node.js mongoose-populate

4
推荐指数
1
解决办法
1563
查看次数

为什么我不能访问mongoose模式的方法?

我在Nodejs应用程序中有这个Mongoose模式:

const mongoose = require('mongoose'),
    Schema = mongoose.Schema,
    sodium = require('sodium').api;

const UserSchema = new Schema({
    username: {
        type: String,
        required: true,
        index: { unique: true }
    },
    salt: {
        type: String,
        required: false
    },
    password: {
        type: String,
        required: true
    }
});

UserSchema.methods.comparePassword = function(candidatePassword, targetUser) {
    let saltedCandidate = candidatePassword + targetUser.salt;
    if (sodium.crypto_pwhash_str_verify(saltedCandidate, targetUser.password)) {
        return true;
    };
    return false;
};

module.exports = mongoose.model('User', UserSchema);
Run Code Online (Sandbox Code Playgroud)

我创建了这个路由文件.

const _ = require('lodash');
const User = require('../models/user.js'); // yes, this …
Run Code Online (Sandbox Code Playgroud)

mongoose node.js mongoose-populate

4
推荐指数
1
解决办法
2085
查看次数

Mongoose document.populate() 不起作用

我正在使用一个非常简单的 Node/Mongo/Express 设置,并尝试填充引用的文档。考虑我的“课程”模式,其中包含“周”:

// define the schema for our user model
var courseSchema = mongoose.Schema({

    teachers        : { type: [String], required: true  },
    description     : { type: String              },
    previous_course : { type: Schema.Types.ObjectId, ref: 'Course'},
    next_course     : { type: Schema.Types.ObjectId, ref: 'Course'},
    weeks           : { type: [Schema.Types.ObjectId], ref: 'Week'},
    title           : { type: String              }

});

// create the model for Course and expose it to our app
module.exports = mongoose.model('Course', courseSchema);
Run Code Online (Sandbox Code Playgroud)

我特别想填充我的几周数组(尽管当我将模式更改为一周时,populate()仍然不起作用)。

这是我一周的计划(一门课程有多个):

var weekSchema = …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js mongoose-populate mongoose-schema

3
推荐指数
1
解决办法
8572
查看次数

NestJS + Mongoose + GraphQL:“填充”不起作用

感谢伟大的框架!

我将 mongoose 与 GraphQL 结合使用并遇到以下问题:

如果我想用 来解析存储在用户的数组“参数”中的 ObjectID populate,在 GraphQL 中我会得到一个空参数数组作为答案的用户。

ArgumentSchema我怀疑定义引用(MongoDB 模式的名称)或填充arguments(用户属性的名称)时出现错误。这是如何正确工作的?

论证模式

export const ArgumentSchema = new mongoose.Schema({
  argument: { type: String, required: true },
  userId: { type: String, required: true },
  username: { type: String, required: true },
});
Run Code Online (Sandbox Code Playgroud)

用户模式

export const UserSchema = new mongoose.Schema({
  username: { type: String, required: true },
  email: { type: String, required: true },
  age: { type: Number, required: true },
  arguments: { type: [mongoose.Schema.Types.ObjectId], required: …
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb mongoose-populate graphql nestjs

3
推荐指数
1
解决办法
3070
查看次数

为什么 mongoose 中需要 execPopulate 方法来填充现有文档?

我知道它的语法及其工作原理,但我无法理解内部工作原理,为什么方法链接一次需要另一种方法,但其他时候不需要?

这段代码工作正常

const cart = await Carts.findById(cartId).populate('product');
Run Code Online (Sandbox Code Playgroud)

但这段代码并没有

let cart = await Carts.findById(cartId);
cart = await cart.populate('product');
Run Code Online (Sandbox Code Playgroud)

为了让它发挥作用,我们使用execPopulate这样的方法。

let cart = await Carts.findById(cartId);
cart = await cart.populate('product').execPopulate();
Run Code Online (Sandbox Code Playgroud)

现在,据我读过 javascript 中的方法链接,代码在没有该execPopulate方法的情况下也应该运行良好。但我似乎无法理解为什么 populate 不适用于现有的猫鼬对象。

mongoose mongodb node.js mongoose-populate

3
推荐指数
1
解决办法
6922
查看次数

Mongoose .populate() 和 .find() 哪个更快

我想获取与用户相关的帖子。哪一个更快

  • 查找用户并填充帖子

    User.findOne({ _id: id}).populate("posts")

  • 或者直接在帖子模型中搜索

    Post.find({ owner: user_id })

javascript mongoose mongodb node.js mongoose-populate

3
推荐指数
1
解决办法
890
查看次数

为什么 mongoose populate 可以工作,而 virtual populate 却不行?

根据文档,我有以下架构

const toolRecordSchema = new mongoose.Schema({
  userId: { type: mongoose.Schema.Types.ObjectId },
});

toolRecordSchema.virtual("user", {
  ref: "User",
  localField: "userId",
  foreignField: "_id",
  justOne: true,
})
Run Code Online (Sandbox Code Playgroud)

当我填充虚拟时,什么也没有发生:

db.ToolRecord.find().populate("user")
Run Code Online (Sandbox Code Playgroud)

但是,如果我将“ref”添加到userId模式中,然后执行.populate("userId"),它会按预期工作,这意味着问题不在于模型之间的关系,而在于虚拟群体。

有什么想法我做错了什么吗?

如果我添加mongoose.set("debug", true),我可以看到将.populate("user")查询产品添加到猫鼬调试日志中的输出:

users.find({}, { skip: undefined, limit: undefined, perDocumentLimit: undefined, projection: {}})
Run Code Online (Sandbox Code Playgroud)

并添加.populate("userId")(有效的)产品此日志:

users.find({ _id: { '$in': [ new ObjectId("631a1fe960d1f82c7fa51a06") ], [Symbol(mongoose#trustedSymbol)]: true }}, { skip: undefined, limit: undefined, perDocumentLimit: undefined, projection: {}})
Run Code Online (Sandbox Code Playgroud)

这样我们就可以看到问题出在哪里。问题是为什么虚拟人口不起作用?

我正在运行猫鼬6

mongoose mongodb node.js mongoose-populate mongoose-schema

3
推荐指数
1
解决办法
921
查看次数