在单独的集合中查找对象数组

时间:2015-10-13 10:33:51

标签: javascript node.js mongodb meteor

简短的问题:

如果log是一个对象数组来做这样的事情(在mongo shell或nodejs或meteor minimongo,任何东西),是否有任何解决方案?

    var log = db.getCollection('myCollection').findOne({_id: 'someId'}).log
    var collection = useAsCollection(log);
    collection.find(anyValidMongoSelector);

长问题:

我有这样的文件:

    {
      "_id": "someId",
      "log": [{
        "operation": "trade",
        "date": ISODate("2010-11-12T17:59:04.332+03:00")
      }, {
        "operation": "sell",
        "date": ISODate("2011-11-14T08:53:22.937+03:00")
      }, {
        "operation": "buy",
        "date": ISODate("2014-11-14T12:44:37.202+03:00")
      }, {
        "operation": "sell",
        "date": ISODate("2012-11-15T12:32:40.910+03:00")
      }, {
        "operation": "buy",
        "date": ISODate("2013-11-17T17:43:15.705+03:00")
      }, {
        "operation": "trade",
        "date": ISODate("2018-11-18T08:51:42.518+03:00")
      }]
    }

我经常需要了解与log数组相关的一些特定信息。例如,最早的操作。

如果数组本身就是一个集合,我只是进行搜索:

    db.getCollection('log').find().sort({date: 1})

但是在我的情况下不能进行这样的搜索。我知道,有$elemMatch projection,但它只返回与条件匹配的第一个元素,并有其他一些限制。

我的解决方案是在myscript.js中写下一些代码:

    function getEarlier() {
      var h1 = db.getCollection('myCollection').findOne({_id: 'someId'}).log,
          earliestDate = new Date();

      for (var i in h1) {
        if (h1[i].date < earliestDate) {
          earliestDate = h1[i].date;}}
      print('The earliest document: ' + earliestDate);}

    getEarlier();

然后执行

    mongo myDB myscript.js

实际的doc结构更复杂,并且站在我面前的问题,所以我有很多这样的函数迭代这个doc。

还有一个问题。是否有任何解决方案来做这样的事情(在mongo shell或nodejs或meteor minimongo,任何东西)?

    var log = db.getCollection('myCollection').findOne({_id: 'someId'}).log
    var collection = useAsCollection(log);
    collection.find().sort({date: 1})

2 个答案:

答案 0 :(得分:1)

我有一个项目default values,允许在JSON对象数组上执行一些有限的Mongodb查询子集。

目前不支持游标,但对于您的情况,您可以执行以下操作:

/admin/structure/file-types/manage/image/display

甚至:

/admin/structure/file-types/manage/image/file-display

...如果您只需要获得一个最新值;

如果使用Mongodb本机驱动程序,问题的解决方案可能如下所示:

{{1}}

请注意,它使用未分类的无索引数据,但我认为{{1}}数组相对较小,否则您将其放入单独的集合中。

答案 1 :(得分:0)

您更新它并在写入时切片,而不是读取。

Logs.update({
  _id: 'someid'
}, {
  $push: {
    'log': {
      $each: [{
        operation: 'sell',
        timestamp: new Date
      }],
      $slice: -100,
      $sort: { timestamp: 1 }
    }
  }
});

基本上,这个按顺序维护你的数组,而不是查询它并保持它的顺序。

我做了类似in my own project的事情,我在那里异步更新日志。也许这可以帮助。