如果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})
答案 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的事情,我在那里异步更新日志。也许这可以帮助。