【问题标题】:Mongoose populating children猫鼬填充儿童
【发布时间】:2017-09-11 13:12:56
【问题描述】:

我在学习猫鼬,看文档http://mongoosejs.com/docs/populate.html

然后我做了:

# initialize some TodoLists and their todos

l1 = new TodoList
    name: "List 1"
l2 = new TodoList
    name: "List 2"

t1 = new Todo 
    title: "Todo 1"
    desc: "Hello 1"
    list: l1._id
t2 = new Todo 
    title: "Todo 2"
    desc: "Hello 1"
    list: l1._id
t3 = new Todo 
    title: "Todo 3"
    dueOn: new Date 2012,6,1
    completedOn: new Date 2012,6,1
    list: l1._id
t4 = new Todo 
    title: "Todo 4"
    desc: "Hello 4"
    list: l2._id

# save all
async.parallel [
    (done) -> l1.save(done)
    (done) -> l2.save(done)
    (done) -> t1.save(done)
    (done) -> t2.save(done) 
    (done) -> t3.save(done)
    (done) -> t4.save(done)
], (err) -> 
    if !err
            # debugging
    Todo.find {}, (err, todos) ->
        console.log todos
            # the populate
    TodoList.findOne({ name: "List 2" })
            .populate("todos")
            .exec (err, list) ->
                console.log list
                done()
    else
        done err

我得到的是这样的:

 [ { desc: 'Hello 1',
    list: 5026321c684d0a6b08000007,
    _id: 5026321c684d0a6b08000009,
    __v: 0 },
  { desc: 'Hello 1',
    list: 5026321c684d0a6b08000007,
    _id: 5026321c684d0a6b0800000a,
    __v: 0 },
  { dueOn: Sun Jul 01 2012 00:00:00 GMT+0800 (SGT),
    completedOn: Sun Jul 01 2012 00:00:00 GMT+0800 (SGT),
    list: 5026321c684d0a6b08000007,
    _id: 5026321c684d0a6b0800000b,
    __v: 0 },
  { desc: 'Hello 4',
    list: 5026321c684d0a6b08000008,
    _id: 5026321c684d0a6b0800000c,
    __v: 0 } ]
{ name: 'List 2',
  _id: 5026321c684d0a6b08000008,
  __v: 0,
  todos: [] }

注意最后一行,todos 没有填充,我希望它有 Todo 4?

【问题讨论】:

  • 我没有看到任何代码在保存之前将元素添加到列表 2 的 todos 数组中;为什么你期望它是非空的?
  • @JohnnyHK,t4 = new Todo({ ..., list: l2._id }) 做那个链接吗?
  • 哦,我明白你现在在想什么了。不,创建包含 l2._idTodo 文档对 l2 文档没有任何影响。

标签: node.js mongodb mongoose


【解决方案1】:

Refs 不是双向的。您已将引用保存到 Todos 的父 Lists,但您没有将 Todos 的引用存储到 List.todos 数组中。

假设您的 List 架构类似于:

var ListSchema = new Schema({
  ...
  todos : [{ type: Schema.Types.ObjectId, ref: 'Todo' }]
});

那么你需要做一个list.todos.push(todo._id)

【讨论】:

    【解决方案2】:

    通过使用以下代码,您无需在 ListSchema 中添加 todos 键。定义 ListSchema 后放如下代码即可:

    ListSchema.virtual('todos', {
        ref: 'Post',
        localField: '_id',
        foreignField: 'list'
    });
    

    现在在列表集合中填充待办事项。

    ListModel.find({}).populate('todos').exec((err, lists) => {
        if (err) return res.status(500).json(err);
    
        return res.status(200).json(lists);
    });
    

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 2015-07-13
      • 2016-10-10
      • 2019-09-16
      • 1970-01-01
      • 2015-07-13
      • 2020-01-17
      • 2011-02-25
      相关资源
      最近更新 更多