我对此还很陌生,所以请耐心等待,但我有 2 个收藏。一个称为照片,另一个称为用户。
在 Node 中,我使用 mongoose 获取数据并将其放入 MongoDB 中。我的架构可以正常工作:
var picSchema = new Schema({
uid: String,
pid: String,
oFile: String
});
Run Code Online (Sandbox Code Playgroud)
我想要做的是对于 uid,我想为上传照片的用户添加 ObjectId。我可以将其作为字符串传递,但是我认为我必须将该字段设置为 ObjectId,但似乎我不能这样做?
除非我遗漏了什么,否则我不妨在其中添加用户名并将其用作参考?
我的mongodb集合中的文档如下所示:
{
"_id" : ObjectId("5562d6831683523f449e7d85")
"geometry" : {
"type" : "Polygon",
"coordinates" :
[[
[-122.4,37.81],
[-132.9, 39.9],
[-122.28, 37.80],
[-124.18, 39.81]
]]
}}
Run Code Online (Sandbox Code Playgroud)
我有一个点(长对),我将其称为x和y。我需要查看文档的坐标是否创建了一个多边形,以便这些坐标位于该多边形内。
因此,我当然需要计算描述多边形等各边的线,然后查看该点的坐标是否在其中。但是,现在,让我们假设我们要查询的文档具有整个数组的最大和最小经度值,x并y在其中。
这是我尝试查询此内容的方法:
db.<collection-name>.find(
{'geometry.coordinates':
{$elemMatch:
{
[{$gt:-122.1}, {$lt:-122.0 }], [{$gt: 37.89 },{$lt: 37.91}]
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
但是,结果是:Unexpected token [。我试图按照这里的例子。
我如何查询这样的数组,其中文档中数组的每个元素都有条件?谢谢。
我正在开发一个从相机收集快照并将该快照的记录保存到快照表中的软件。我们有数千台摄像机和数亿个快照记录。每个快照记录仅包含少量数据-id,camera_id,时间戳和注释(字符串字段,以获取其他信息)。
我们开始注意到某些查询中的性能问题,主要是在给定时间范围内获取大量快照。除了升级Postgres所运行的硬件之外,我们还在寻找提高整个系统性能的替代方法。
在使用MongoDB之前,该团队也遇到了类似的情况,其中一个表用于相机,一个表用于快照。他们切换到为每个摄像机使用单独的快照表,从而产生了数千个快照表。这将性能提高了10倍,而不会引起新的问题。
现在,我们在Postgres上面临着同样的问题。即使上述解决方案有效,但似乎并没有针对数据库进行优化。在Postgres中做同样的事情会是一个疯狂的想法吗?通常使用的表数量是否存在已知限制?在该用例中,我找不到很好的信息。
我有两个架构说城市和博客.我想用分页创建一个博客页面.所以我参考城市名称填充博客.如果我没有城市的博客,那么就不应该退回.这是我获取博客的查询.
City.find().skip(req.params.pageIndex*2).limit(2).sort('-created').populate('articles').exec(function(err, cities) {
res.jsonp(cities)
}
Run Code Online (Sandbox Code Playgroud)
如果我使用上面的查询.我得到的城市也没有博客.因此它会在视图中产生一个空行.我不希望这种情况发生.如何限制填充的字段而不返回没有博客的城市.有什么建议?
要直接,我该怎么做:
group._id = {
year: { $year : [{ $subtract: [ "$timestamp", 25200000 ]}] },
month: { $month : [{ $subtract: [ "$timestamp", 25200000 ]}] },
day: { $dayOfMonth : [{ $subtract: [ "$timestamp", 25200000 ]}] }
};
Run Code Online (Sandbox Code Playgroud)
用spring数据
我已经尝试了这个和其他一些形式并没有成功
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(c),
Aggregation.project("programa", "custo", "duracao", "dataHora")
.andExpression("dataHora").minus(25200000).extractDayOfMonth().as("dia")
.andExpression("dataHora").minus(25200000).extractMonth().as("mes")
.andExpression("dataHora").minus(25200000).extractYear().as("ano"),
Aggregation.group("programa", "ano", "mes", "dia")
.count().as("count")
.sum("custo").as("valorTotal")
.sum("duracao").as("duracaoTotal")
.first("dataHora").as("dataHora"),
Aggregation.sort(Direction.ASC, "dataHora")
);
Run Code Online (Sandbox Code Playgroud)
我需要在mongodb中按天,月和年进行分组,否则我需要在代码中转换所有这些分组数据.
提前致谢
java mongodb spring-mongo mongodb-query aggregation-framework
我已经有一个查询,如下所示:
{$match:{
"when":{$gt: new Date(ISODate().getTime() - 1000 * 60 * 60 * 24 * 30)}
}},
{$project:{
"year":{$year:"$when"},
"month":{$month:"$when"},
"day": {$dayOfMonth:"$when"}
}},
{$group:{
_id:{year:"$year", month:"$month", day:"$day"},
"count":{$sum:1}
}},
{$sort:{
_id: 1
}}
Run Code Online (Sandbox Code Playgroud)
结果如下所示:
{ "_id" : { "year" : 2015, "month" : 10, "day" : 19 }, "count" : 1 }
{ "_id" : { "year" : 2015, "month" : 10, "day" : 21 }, "count" : 2 }
Run Code Online (Sandbox Code Playgroud)
除了过去 30 天的结果,我怎么能以相同的格式获得结果,即使count是 0?
像这样:
{ "_id" : { …Run Code Online (Sandbox Code Playgroud) 我试图根据一些匹配条件获取数据.首先我试过这个:这里ending_date是全日期格式
Offer.aggregate([
{
$match: {
carer_id : req.params.carer_id,
status : 3
}
},
{
$group : {
_id : { year: { $year : "$ending_date" }, month: { $month : "$ending_date" }},
count : { $sum : 1 }
}
}],
function (err, res)
{ if (err) ; // TODO handle error
console.log(res);
});
Run Code Online (Sandbox Code Playgroud)
这给了我以下输出:
[ { _id: { year: 2015, month: 11 }, count: 2 } ]
Run Code Online (Sandbox Code Playgroud)
现在我想检查一年,所以我正在尝试这个:
Offer.aggregate([
{
$project: {
myyear: {$year: "$ending_date"}
}
},
{
$match: …Run Code Online (Sandbox Code Playgroud) let dbOperations = Edge.collection.initializeOrderedBulkOp()
edges.forEach(edge => {
dbOperations.find({_id: edge.id}).upsert().updateOne({
$set: {
value: edge.value
},
$setOnInsert: {
_id: edge.id
}
})
})
dbOperations.execute()
.then(result => {
console.log(result.nModified) // This shows the number of edges that is actually modified
console.log(result.getModifiedIds()) // This is what I want to achieve
})
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目标?
我想总结一下minuts中starttime和endtime的差异.
{
"_id" : ObjectId("56cd544df7851e850d8b4573"),
"user_id" : "281",
"document_id" : "1455614372.pdf",
"page_number" : "1",
"starttime" : ISODate("48118-03-20T01:35:14Z"),
"endtime" : ISODate("48118-03-20T04:29:10Z")
}
{
"_id" : ObjectId("56cd544df7851e850d8b4574"),
"user_id" : "281",
"document_id" : "1455614372.pdf",
"page_number" : "1",
"starttime" : ISODate("48118-03-20T14:29:49Z"),
"endtime" : ISODate("48118-06-22T12:52:36Z")
}
{
"_id" : ObjectId("56cd544df7851e850d8b4575"),
"user_id" : "281",
"document_id" : "1455614372.pdf",
"page_number" : "2",
"starttime" : ISODate("48118-03-20T04:29:10Z"),
"endtime" : ISODate("48118-03-20T14:29:49Z")
}
Run Code Online (Sandbox Code Playgroud)
我的收藏名称是pdftracker.
我的数据看起来像这样:
{
"_id" : "9aa072e4-b706-47e6-9607-1a39e904a05a",
"customerId" : "2164289-4",
"channelStatuses" : {
"FOO" : {
"status" : "done"
},
"BAR" : {
"status" : "error"
}
},
"channel" : "BAR",
}
Run Code Online (Sandbox Code Playgroud)
我的聚合/组如下所示:
{
"_id" : {
"customerId" : "$customerId",
"channel" : "$channel",
"status" : "$channelStatuses[$channel].status"
},
"count" : {
"$sum" : 1
}
}
Run Code Online (Sandbox Code Playgroud)
所以基本上对于示例数据,该组应该给我一个按以下分组分组的组:
{"customerId": "2164289-4", "channel": "BAR", "status": "error"}
Run Code Online (Sandbox Code Playgroud)
但是我不能在聚合/组中使用 []-indexing。我应该怎么做?
mongodb ×9
mongoose ×3
node.js ×2
database ×1
geojson ×1
geolocation ×1
java ×1
mapreduce ×1
pagination ×1
performance ×1
postgresql ×1
spring-mongo ×1