在嵌套文档中添加元素,然后检索_id

时间:2016-05-02 11:28:14

标签: node.js mongodb mongoose

我有以下集合定义:

// Includes
import mongoose from 'mongoose';

const Schema = mongoose.Schema;

// Create required sub schemas
const subSchema0 = new Schema({
   value: String,
});

const subSchema = new Schema({
  idWordsLibraryName: {
    type: Schema.Types.ObjectId,
    ref: 'WordsLibrary1_0',
  },

  type: String,
  values: [
    subSchema0,
  ],
});

const schema = new Schema({
  version_: String,

  idWordsLibraryName: {
    type: Schema.Types.ObjectId,
    ref: 'WordsLibrary1_0',
  },

  idsDads: [{
    type: Schema.Types.ObjectId,
    ref: 'LocationStructure1_0',
  }],

  params: [
    subSchema,
  ],
});

摘要 - >一个带嵌套参数和嵌套值的文档。

我有以下请求将一些值添加到特定参数

this.findOneAndUpdate({
  _id: data.idLocationStructure,

  'params._id': data.idLocationStructureParameter,
}, {
  $push: {
    'params.$.values': {
      $each: dataToPush,
    },
  },
}, {
  new: true,
});

它按预期工作。

我现在想要的是获取推送元素的_id,但不加载参数的所有值。

我尝试使用findOneAndUpdate的select选项,但它不能使用投影:

this.findOneAndUpdate({
  _id: data.idLocationStructure,

  'params._id': data.idLocationStructureParameter,
}, {
  $push: {
    'params.$.values': {
      $each: dataToPush,
    },
  },
}, {
  new: true,

  select: {
    'params.$.values': 1,
  },
});

它让我:

{
  "_id": "57273904135f829c3b0739dd",

  "params": [
    {},
    {},
    {},
    {},
  ],
},

我也试图执行第二个请求以获取_ids,但它也不起作用:

this.find({
  _id: data.idLocationStructure,

  'params._id': data.idLocationStructureParameter,
}, {
  _id: 1,

  'params.$.values': {
    $slice: -nbAdded,
  },
});

如果你知道如何在不加载参数的所有值的情况下检索推送值的_id,那么非常欢迎你。

1 个答案:

答案 0 :(得分:0)

经过网上大量的研究和堆栈溢出< 3我找到了一个解决方案,即:

this.aggregate([{
    $match: {
      _id: new mongoose.Types.ObjectId(data.idLocationStructure),
    },
  },
  {
    $unwind: '$params',
  }, {
    $match: {
      'params._id': new mongoose.Types.ObjectId(data.idLocationStructureParameter),
    },
  },
  {
    $unwind: '$params.values',
  },
  {
    $sort: {
      'params.values._id': -1
    },
  },
  {
    $limit: nbAdded,
  },
  {
    $project: {
      _id: '$params.values._id',
    },
  },
]);

如果你遇到同样的问题,这里有解释:

  • $match让我参加了优秀的高级文档

  • $unwind让我进入文档中的params数组$match

  • $match让我参加了好的参数

  • $unwind让我进入数值数组

  • $sort所有值_id DESC

  • $limit我预先添加的值的数量

  • 我更改_id 的名称(如别名)

所以我得到一个包含最后添加的值_ids

的数组