MongoDB排序更新

3

示例文档如下:

{
    _id: 1,
    "somearray": 
      [
        {
            year: 2013
        },
        {
            year: 2012
        },
        {
            year: 2011
        },
        {
            year: 2010
        }
      ]
}

数组"somearray"已经排序。假设我将第二个对象{year : 2012}更新为{year : 2014},那么是否有可能对该数组进行排序。更新后的期望输出如下:

{
    _id: 1,
    "somearray":
      [
        {
            year: 2014
        },
        {
            year: 2013
        },
        {
            year: 2011
        },
        {
            year: 2010
        }
     ]
}

有人可以帮忙吗?


这是有关编程的内容,请将以下文本从英语翻译成中文。仅返回已翻译的文本:这会有所帮助:http://docs.mongodb.org/manual/reference/operator/update/sort/#sort-array-elements-that-are-not-documents - Dev
1
你是如何更新这个文档的?如果你能分享一下代码就更好了。 - Dev
@user3805045 你有没有看过$sort - bagrat
1
@ n9code 是的,我做过。我使用 $sort 来推送对象。但是这里的情况不是推送,我面临的问题是在使用排序功能更新现有对象。 - manojpt
2个回答

1

解决了我的问题,谢谢。 - zahra_oveyedzade

0

MongoDB允许使用$elemMatch$运算符更新嵌套文档,因此您可以按如下方式更新year

db.collectionName.update({"somearray":{"$elemMatch":{"year":2012}}},{"$set":{"somearray.$.year":2014}}) 

这个查询更新了年份 2012 到 2015,但数组位置没有改变。但是如果你仍然想使用更新后的值来更改数组位置,那么你应该使用一些编程逻辑或者代码。我编写了这个脚本,它会更新数组并按顺序推送。

function compare(a, b) {
  if(a.year > b.year) return -1;
  if(a.year < b.year) return 1;
  return 0;
}
var givenYear = 2012; // which year you want to update
var array = []; // empty array to push data 
db.collectionName.find().forEach(function(data) {
  var objects = data.somearray;
  for(var i = 0; i < objects.length; i++) {
    if(data.somearray[i].year == givenYear) {
      array.push({
        "year": 2014
      });
    } else {
      array.push({
        "year": data.somearray[i].year
      });
    }
  }
  var sortedArray = array.sort(compare); // pass to compare function to sort the array with year
  db.collectionName.update({
    "_id": 1,"somearray":{"$elemMatch":{"year":2012}} //match criteria
  }, {
    "$set": {
      "somearray": sortedArray // updated whole array with new sorted array
    }
  });
}) 

注意:比较函数 ref


你确定 user3805045 使用 JavaScript 作为编程语言吗?你是想说在客户端进行排序,然后更新整个数组比进行两次独立的更新更好吗?这太荒谬了 :) - bagrat
1
@n9code 这里我提供了另一种匹配和排序数组的方法。我不知道 user3805045 是否使用 JavaScript,但我在这里解释另一种更新的方式,更重要的是,每次更新 MongoDB 都会更新与集合关联的每个索引,而不仅仅是数据本身这里,为避免这种索引更新,MongoDB 引入了批量更新。因此,将文档更新到一个请求中是更好的方法。 - Neo-coder
啊哈,而在你的情况下,你需要从MongoDB中获取整个数组,在客户端上进行更新,客户端上排序并将整个数组发送回来。 - bagrat
实际上我想要用Java来解决。Javascript的解决方案或许可以帮到其他人。我了解到需要获取数据,对其进行排序然后使用set方法进行更新。 - manojpt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接