mongodb morphia怎么获取最大的id

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mongodb morphia怎么获取最大的id相关的知识,希望对你有一定的参考价值。

第一种:使用IdGenerator属性,并在Bson特性上进行指定。
第二种:自增id生成器。这个需要你自己写代码来实现,原则是1个集合对应1个自增序列,并使用MongoShell自带的$inc进行原子自增操作(更新后再获取FindAndModify)。

根据你的需求,你应该当选择第二种方法。可以利用反射将每一个实体类对应的集合去让其自动生成自增集合;或者由一个集合容器来统一管理所有需要自增的集合的自增序列。
参考技术A

在mongodb的单个查询中获取最小值和最大值

【中文标题】在mongodb的单个查询中获取最小值和最大值【英文标题】:Get min and max value in single query in mongodb 【发布时间】:2018-11-26 18:05:30 【问题描述】:

考虑“单词”中的以下文档:

[
  _id: 1,
  usages: 2,
  word: "Name"
, 
  _id: 2,
  usages: 1,
  word: "Street"
, 
  _id: 3,
  usages: 1,
  word: "House"
, 
  _id: 4,
  usages: 3,
  word: "Table"
, 
  _id: 5,
  usages: 3,
  word: "Bread"
, 
  _id: 6,
  usages: 4,
  word: "Door"
]

如何获取使用次数最低或最高的所有记录?最低应返回 id 2 和 3(及其单词),最高应返回 id 6 及其单词。

我需要将这些数据聚合成随机数量的最低/最高记录(准确地说是 50 个),因此它需要是一个聚合。

它应该是单次查找,因此使用 $max 或 $min 的另一个查询无法找到最小值/最大值。

MongoDB 版本是 3.4.7,Mongoose 版本是 5.0.0-rc1。不需要 Mongoose 解决方案,因为我可以使用原始查询。 (但它是首选!)

例子:

Words.aggregate([ 
   
    $match:  _
      usages:  WHAT_SHOULD_I_HAVE_HERE 
    
  ,  
    $sample:  
      size: 50 
     
  
])

谢谢!

【问题讨论】:

【参考方案1】:

你可以试试下面的聚合

$facet 将为您提供usages 的两个最低和最高值,您可以使用$filter 运算符轻松地通过它们$project

db.collection.aggregate([
   "$facet": 
    "minUsages": [ "$sort":  "usages": -1  ],
    "maxUsages": [ "$sort":  "usages": 1  ]
  ,
   "$addFields": 
    "lowestUsages": 
      "$arrayElemAt": ["$minUsages", 0]
    ,
    "highestUsages": 
      "$arrayElemAt": ["$maxUsages", 0]
    
  ,
   "$project": 
    "minUsages": 
      "$filter": 
        "input": "$minUsages",
        "as": "minUsage",
        "cond": 
          "$eq": ["$$minUsage.usages", "$lowestUsages.usages"]
        
      
    ,
    "maxUsages": 
      "$filter": 
        "input": "$maxUsages",
        "as": "maxUsage",
        "cond": 
          "$eq": ["$$maxUsage.usages", "$highestUsages.usages"]
        
      
    
  
])

或者您也可以使用find 查询来完成此操作

const minUsage = await db.collection.find().sort( "usages": -1 ).limit(1)
const maxUsage = await db.collection.find().sort( "usages": 1 ).limit(1)

const minUsages = await db.collection.find( "usages":  "$in": [minUsages[0].usages]  )
const maxUsages = await db.collection.find( "usages":  "$in": [maxUsages[0].usages]  )

看看here

【讨论】:

您的聚合工作完美!尽管您仍然添加了具有 2 个或 4 个查询的方法。你认为 find 方法比聚合方法更快吗?

以上是关于mongodb morphia怎么获取最大的id的主要内容,如果未能解决你的问题,请参考以下文章

Playframework + Morphia + MongoDb + ElasticSearch = Disater?

如何处理 MongoDB / Morphia 中的查询迁移?

Morphia:将MongoDb文档检索为Java对象

morphia操作mongodb

基于Morphia实现MongoDB按小时按天聚合操作

Spring Data MongoDB 五:进阶文档查询(分页Morphia)