Mongoose 只从文档的嵌套数组中返回一个元素

Nik*_*des 2 mongoose mongodb node.js

我想在我的文档中获取一个数组中的单个元素,而不是获取整个数组本身。使用猫鼬可以这样做吗?

我试过使用dot.notation但它似乎不起作用 - 它只是在“索引点”之后获取空的嵌套对象

  // Here I'd like to get 
  // The first undo-ed item from the first board within my `boardBucket`

  Room.findOne({name: this.name}, `boardBucket.items.0.undoedItems.1`, (err, result)=> {
    if (err) throw err;
    console.log(JSON.stringify(result, null, 4));
  })
Run Code Online (Sandbox Code Playgroud)

有没有办法实现这一目标?

我想避免获取整个数组的原因

  • 我的对象非常大,如果我将它们全部取回会导致内存问题
  • 然而,它是低效的。

这是我Schema的以防万一它有帮助:

var roomSchema = new mongoose.Schema({
    name: String,
    boardBucket: {
      currentBoardId: String,
      items: [
        {
          boardId: String,
          boardItems: Array,
          undoedItems: Array, // <- Need to get a *single* element from this array
          viewPosition: String
        }
      ]
    }
});
Run Code Online (Sandbox Code Playgroud)

Rav*_*rti 5

您可以使用slicemongoosequery提供的功能。阅读有关切片的猫鼬文档以更好地理解。

根据文档:

slice([path], val)
Run Code Online (Sandbox Code Playgroud)

指定数组的 $slice 投影。

参数:

[path] <String>
val <Number> number/range of elements to slice
Run Code Online (Sandbox Code Playgroud)

试试这个解决你的问题,我希望它有效:

Room.findOne({name: this.name})
    .slice('boardBucket.items', 1)
    .slice('boardBucket.items.undoedItems', [1,1])
    .exec()
Run Code Online (Sandbox Code Playgroud)

这将返回items数组的第一个元素,以及undoedItems.