我有以下集合定义:
// 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
,那么非常欢迎你。
答案 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