【问题标题】:Get only the last element of array mongoose仅获取数组 mongoose 的最后一个元素
【发布时间】:2016-05-27 05:23:38
【问题描述】:

我在一个文档中有一个数组,我尝试接收这个数组的最后一个元素。

我的代码是:

Post.find({_id:postId},{'comments':{'$slice':-1}});

这给了我所有的对象,但 cmets 数组只包含最后一个元素。

另一方面,

Post.find({_id:postId},{'comments':1});

只给我cmets。

我不知道如何将这两个命令组合在一起。怎么做?

{
 "users":[],
 "comments":["string1","string2","string3"],
 "lastValue":"Wow"
 "name":"jow"
 "_id": {
    "$oid": "5747d6bdecfae9d0560077cc"
   },
}

谢谢

【问题讨论】:

  • 您能否发布您收藏的示例文档?
  • 你的目标是什么?您尝试从哪个数组中检索最后一个元素?
  • "cmets":["string1","string2","string3"],

标签: node.js mongodb mongoose


【解决方案1】:

您可能想像这样使用 mongodb(3.2 版)聚合 $slice

Post.aggregate([
  { 
    $match: { 
      '_id.$oid': postId 
    }
  },
  { 
    $project: {
      comments: {
        $slice: [ "$comments", -1 ] 
      }
    }
  }
]);

在早期版本的 mongodb 中:

Post.aggregate([
  { 
    $match: { 
      '_id.$oid': postId 
    }
  },
  { 
    $unwind: "$comments"
  },
  {
    $group : {
      _id: "$_id.$oid",
      comment: { $last: "$comments" }
    }
  }
]);

【讨论】:

  • 这几乎可行,我使用第二个,但他们的 _id 有问题,它找不到 _id。如果我删除 _id:postId,我会收到每个元素的最后一个..
  • @Alon 在您的示例中搜索{ _id: postId },但在给定的示例中有$oid。您只需在$group _id 字段和$match 条件中指定有效的集合标识符。更新了答案。
  • 你的修复不起作用,我发现 use , _id:mongoose.Types.ObjectId(postId) 有效
  • @Alon 哦,我不知道你在postId 中有什么,这也是有道理的。
【解决方案2】:

我希望这会有所帮助。

db.Post.find(
  { _id: postId },
  { comments: { $slice: -1 }, _id: 0, users: 0, lastValue: 0, name: 0 },
);

【讨论】:

  • 我希望它们是最简单的,因为如果我在方案中添加东西,我也必须更改这一行。
【解决方案3】:

如果是Mongooseslice 也可以这样工作,

model.find({ 
    // condition
})
.select('fields')
.slice('array', -1) // <------ Here
.then((data) => {
    // handle
})
.catch();

只是写了伪代码,因为它可能对某人有帮助。

【讨论】:

    【解决方案4】:
    db.collection_name.find({'name':'how'},{'comments': {$slice: -1}})
    

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 2019-01-03
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2016-09-29
      • 2017-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多