MongoDB投影有$slice如何只显示该字段

简单的投影

稍微用过MongoDB的都知道,投影很简单,就直接

db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)},{comments: 1})

添加$slice的投影

然而,当我要给comments分页($slice)如何做呢?

错误的做法

以下给出了错误的做法

db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)},{comments: 1, comments:{$slice:[0,1]}})

这样写的话,就只有分页,然后字段显示全部

原因

对象中,同名字段,后者会覆盖前者。所以{comments: 1, comments: {$slice:[0,1]}}中实际生效的只有comments:{$slice:[0,1]}

同理,如果两个调换位置变成{comments: {$slice:[0,1]}, comments: 1},那么实际生效的就是comments: 1没有分页

正确的写法

$elemMatch,可以做到

db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)}, {comments:{$slice:[0,1]},  $elemMatch:1})

对于$elemMatch官网文档也没有说明此用法。所以我也不知道这个算不算歪门邪道吧哈哈。

有其他更优雅的写法,求告知

spring中如何用

在spring中,Query的拼装如下。要用正常的include去写。

Query query = new Query();
query.addCriteria(Criteria.where("_id").is(new ObjectId("5a5085aed8f10c1a6cc0395b")));
query.fields().slice("comments", 0, 1);
query.fields().include("$elemMatch");

错误的拼法

query.fields().slice("comments", 0, 1).elemMatch("comments", new Criteria());

这样拼完会变成

db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)}, {comments:{$slice:[0,1]},  $elemMatch: {}})

而这个语句在MongoDB直接执行的话会报错

原文地址:https://www.cnblogs.com/chenchuxin/p/8254149.html

时间: 2024-10-22 05:14:06

MongoDB投影有$slice如何只显示该字段的相关文章

mongodb查询只显示指定字段

db.COMMODITY_COMMODITY.find( { "areaCode" : "320100" , "backCatalogId" : { "$in" : [ 111111, 22222]} , "typeCode" : { "$in" : [ "appointment" , "groupon"]} , "status"

【Mongodb教程 第十四课 】MongoDB 投影

mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段. find() 方法 MongoDB 的find()方法,在 MongoDB查询 文档解释接受第二个可选参数是要检索的字段列表.在MongoDB中,当执行find()方法,那么它会显示一个文档所有字段.要限制这一点,需要设置的字段列表值1或0. 1用来显示字段而0是用来隐藏字段. 语法: find()方法具有投影基本语法如下 >db.COLLECTION_

MongoDB (九) MongoDB 投影

mongodb 投影意思是只选择必要的数据而不是选择一个文件的数据的整个.如果一个文档有5个字段,需要显示只有3个,然后选择其中只有3个字段. find() 方法 MongoDB 的find()方法,在 MongoDB查询 文档解释接受第二个可选参数是要检索的字段列表.在MongoDB中,当执行find()方法,那么它会显示一个文档所有字段.要限制这一点,需要设置的字段列表值1或0. 1用来显示字段而0是用来隐藏字段. 语法: find()方法具有投影基本语法如下 >db.COLLECTION_

ubantu终端下只显示当前路径,而不显示绝对路径

Ubuntu下,默认情况下,对于终端,是显示出绝对的路径的,比如: 现在想要让其只显示相对路径. [解决过程] 参考: Linux中,去掉终端显示的当前目录的绝对路径 1.先输入命令: sudo vim ~/.bashrc 找到.bashrc中的,有关PS1的部分,从: if [ "$color_prompt" = yes ]; then    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\[email protected

asp 之 让实体中字段类型为DateTime的字段只显示日期不显示时间

       在我们平时的工作开发中,我们通常会遇到这样的一个问题:某个实体的某个字段是DateTime类型的,可是我们在界面上只想让它显示日期不显示时间! 一个订单实体: //订单类 public class order { //订单ID public int id{get;set;} //物品ID public int resId{get;set;} //物品名称 public string resName { get; set; } //物品价格 public decimal price

【转】WPF DatePicker只显示年和月

最近的项目,查询时只需要年和月,不需要日,因此需要对原有的DatePicker进行修改,查询了网上的内容,最终从一篇帖子里看到了添加附加属性的方法,地址是http://stackoverflow.com/questions/1798513/wpf-toolkit-datepicker-month-year-only 原文是用了两个类,其中一个是为了让DatePicker下的Calendar只显示年月,不显示日,另一个类是为了让DatePicker格式化为yyyy-MM格式,但是从文章中可以看出,

设置View只显示透明下边框、透明背景框、阴影背景框的方法

实现的效果如下: 下面的代码是实现一个带边框的xml,很常见 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="@android:color/transparent" /> <str

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv

img只显示图片一部分 或 css设置背景图片只显示图片指定区域

17:14 2016/3/22img只显示图片一部分 或 css设置背景图片只显示图片指定区域 background-position: 100% 56%; 设置背景图片显示图片的哪个坐标区域,图片左上角为0,0或0%,0%,右下角为高度和宽度,或100%,100%. clip:rect(300px 100px 300px 0px); 设置显示图片的某个区域,分别是上右下左的顺序设置 部分代码:<style type="text/css">img {position:abs