在对象数组中查找,就像在单独的集合中查找一样
Find in array of objects as in a separate collection
短问题:
如果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投影,但它只返回符合条件的第一个元素,并且有一些其他限制。
我的解决方案是在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
实际的文档结构更复杂,也站在我面前的问题,所以我有很多这样的函数迭代这个文档。
再来一遍这个问题。是否有任何解决方案从盒子做这样的事情(在mongo shell或nodejs或meteor minimongo,任何东西)?
var log = db.getCollection('myCollection').findOne({_id: 'someId'}).log
var collection = useAsCollection(log);
collection.find().sort({date: 1})
我有一个项目micromongo,它允许在JSON对象数组上执行Mongodb查询的一些有限子集。
游标目前不支持,但对于您的情况,您可以执行以下操作:
var mm = require('micromongo');
function ISODate(s) { return new Date(s); }
var 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")
// ......
}];
var sorted = mm.aggregate(log, [
{ $sort: { date: 1 } }
]);
console.log(sorted);
甚至:
var sorted = mm.aggregate(log, [
{ $sort: { date: 1 } },
{ $limit: 1 }
]);
…如果您只需要获取一个最新值;
如果使用Mongodb本地驱动程序,您的问题的解决方案可能如下所示:
var mm = require('micromongo');
var MongoClient = require('mongodb').MongoClient;
var url = 'mongodb://localhost:27017/test';
MongoClient.connect(url, function(err, db) {
console.log("Connected succesfully to server");
db.collection('logger').findOne({}, function(err, doc) {
var log = doc.log;
var sorted = mm.aggregate(log, [
{ $sort: { date: -1 } }
]);
console.log(sorted);
db.close()
});
});
请注意,它使用未排序的未索引数据,但我假设log
数组相对较小,否则您将把它放在单独的集合中。
您更新它并在写而不是读时进行切片。
Logs.update({
_id: 'someid'
}, {
$push: {
'log': {
$each: [{
operation: 'sell',
timestamp: new Date
}],
$slice: -100,
$sort: { timestamp: 1 }
}
}
});
本质上,这个使数组保持有序,而不是对它进行查询并保持有序。
我在我自己的项目中做了类似的事情,我异步更新日志。
相关文章:
- 正在全局范围中查找JavaScript函数
- Javascript(Angular)从一个对象数组到第二个数组查找值
- 在不使用jquery的情况下查找页面中的所有锚点并附加函数
- es6 相当于下划线查找位置
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 如何使用jquery迭代具有相同属性的html元素并查找onclick事件
- 如何在不传递此信息的情况下查找被调用的元素
- Lodash 从值数组中查找数组中的值
- 如何使用JavaScript查找1和N之间的所有数字的总和
- 使用RegExp查找url中的字符
- 查找元素高度,包括边距
- 使用JS查找数组的平均值
- 查找最短和最长日期
- 使用向下箭头键(与tab键一样)聚焦下一个输入
- 猫鼬在特定记录中查找嵌套记录
- 使用javascript在MVC中查找网格长度时出错
- Javascript查找匹配值的键,就像SQL中的查询一样
- Javascript:在对象中快速查找值(就像我们可以查找属性一样)
- 在控制器中查找父作用域属性,就像在模板中一样
- 在对象数组中查找,就像在单独的集合中查找一样