我目前正在设计一个全文搜索系统,用户可以在其中对MS Office和PDF文档执行文本查询,结果将返回与查询最匹配的文档列表.然后,用户将选择返回的任何文档,并在MS Word,Excel或PDF查看器中查看该文档.
我可以使用ElasticSearch或Solr将原始二进制文档(即.docx,.xlsx,.pdf文件)导入其"数据存储",然后根据命令将文档导出到用户的设备以供查看.
以前,我使用MongoDB 2.6.6将原始文件导入GridFS,并将提取的文本导入单独的集合(该集合包含文本索引),并且工作正常.但是,MongoDB全文搜索是非常基本的,因此我现在正在寻找Solr或ElasticSearch来执行更复杂的文本搜索.
缺口
我使用MongoDB和Mongoose作为我的ODM,我正在尝试使用populate
和group by
在同一语句中进行查询.
这是我的简单文档模型:
var userSchema = new Schema({
username: String
});
var messageSchema = new Schema({
from: { type: Schema.ObjectId, ref: 'User' },
to: { type: Schema.ObjectId, ref: 'User' },
message: String,
date: { type: Date, default: Date.now }
});
Run Code Online (Sandbox Code Playgroud)
我只是试图为每个用户收集每条消息,由他与之交谈的每个用户进行分组.我试过这样的:
this.find({ 'to': user })
.sort({ 'date': 1 })
.group('from')
.populate(['from', 'to'])
.exec(callback);
Run Code Online (Sandbox Code Playgroud)
但是,不幸的是,我的模型没有group
方法.你有任何解决方案,让这个工作吗?
谢谢.
我的文档结构如下:
{
map: 'A',
points: [
{
type: 'type1',
distanceToSpawn: 110
},
{
type: 'type4',
distanceToSpawn: 40
},
{
type: 'type6',
distanceToSpawn: 30
}
]
},
{
map: 'B',
points: [
{
type: 'type1',
distanceToSpawn: 100
},
{
type: 'type2',
distanceToSpawn: 60
},
{
type: 'type3',
distanceToSpawn: 25
}
]
},
{
map: 'C',
points: [
{
type: 'type2',
distanceToSpawn: 90
},
{
type: 'type3',
distanceToSpawn: 1
},
{
type: 'type6',
distanceToSpawn: 76
}
]
}
Run Code Online (Sandbox Code Playgroud)
我希望得到所有具有type1
按distanceToSpawn …
我是mongodb的新手并且第一次尝试聚合.在这里,我试图按每15分钟对推文进行分组.当我尝试在mongo控制台中运行以下查询时,我收到错误:
管道阶段规范对象必须只包含一个字段.
db.hashtag.aggregate([
{ "$group": {
"_id": {
"year": { "$year": "$tweettime" },
"dayOfYear": { "$dayOfYear": "$tweettime" },
"interval": {
"$subtract": [
{ "$minute": "$tweettime" },
{ "$mod": [{ "$minute": "$tweettime"}, 15] }
]
}
}},
"count": { "$sum": 1 }
}
])
Run Code Online (Sandbox Code Playgroud)
我无法在SO中找到原因的好解释.请分享您对此主题的看法以及查询错误的原因.
MongoDB有一个新的聚合框架,我试图弄清楚如何将它与Mongoid一起使用.似乎有一个Moped分支具有此处讨论的此功能.我已经更新到MongoDB 2.2并尝试在我的应用程序上安装这个Moped分支,如下所示:
gem'pedped',git:'git://github.com/mongoid/moped.git',branch:'aggregation-support'
但聚合仍然无效.这是我用来测试它的电话:
= Post.all.aggregate({"$ group"=> {"_ id"=>"$ _id"}})
UPDATE
在mongo shell中,这可以工作:
db.users.aggregate({$ group:{_ id:"$ _id"}})
所以我认为这是一个Mongoid问题......任何关于这个的话都会很棒!
我有一个路由设置,使用一个名为Todo的模型,如下所示:
app.get('/api/todos', function(req, res) {
Todo.find({},function(err, todos) {
if (err)
res.send(err);
console.log("number of todos " + todos.length);
res.json(todos); // return all todos in JSON format
});
});
Run Code Online (Sandbox Code Playgroud)
但是,todos.length始终为0,因为它没有找到任何结果.当我跑:
use test3
db.Todo.find()
Run Code Online (Sandbox Code Playgroud)
我确信我已连接到同一个数据库.我可以在mongod控制台中看到连接.我的连接在config/db.js文件中:
module.exports = {
url : 'mongodb://localhost/test3'
}
Run Code Online (Sandbox Code Playgroud)
我的server.js中的连接如下:
var db = require('./config/db');
mongoose.connect(db.url);
Run Code Online (Sandbox Code Playgroud)
在Mongo Shell我得到1个结果.我希望通过查询查询返回此结果.有没有我错过的东西?我使用的是Mongoose 3.6
干杯
在产品系列中,我有一系列Recentviews,其中有2个字段被查看和查看日期.
在一个场景中,如果我已经有一个记录viewedby
,那么我需要更新它.例如,如果我有这样的数组: -
"recentviews" : [
{
"viewedby" : "abc",
"vieweddate" : ISODate("2014-05-08T04:12:47.907Z")
}
]
Run Code Online (Sandbox Code Playgroud)
用户是abc
,所以我需要更新上面的&如果没有abc
我必须的记录$push
.
我试过$set
如下: -
db.products.update( { _id: ObjectId("536c55bf9c8fb24c21000095") },
{ $set:
{ "recentviews":
{
viewedby: 'abc',
vieweddate: ISODate("2014-05-09T04:12:47.907Z")
}
}
}
)
Run Code Online (Sandbox Code Playgroud)
上面的查询将删除Array中的所有其他元素.
我在mongodb有这个收藏
{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
{
"name" : "name1",
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
我想找到基于someArray.someNestedArray.name的文档,但我找不到任何有用的链接所有关于更新嵌套数组的搜索结果我正在尝试这个但是什么都不返回
db.mycollection.find({"someArray.$.someNestedArray":{"$elemMatch":{"name":"1"}}})
db.mycollection.find({"someArray.$.someNestedArray.$.name":"1"})
Run Code Online (Sandbox Code Playgroud)
还有别的东西
我如何通过双嵌套数组mongodb中的元素找到?
我有一个集合,哪些元素可以简化为:
{tags : [1, 5, 8]}
数组中至少有一个元素,所有元素都应该不同.我想用一个标签替换另一个标签,我认为不会有问题.所以我想出了以下查询:
db.colll.update({
tags : 1
},{
$pull: { tags: 1 },
$addToSet: { tags: 2 }
}, {
multi: true
})
Run Code Online (Sandbox Code Playgroud)
很酷,所以它会找到所有带有我不需要的标签的元素(1),删除它并添加另一个(2)如果它不存在.问题是我收到一个错误:
"无法同时更新'标签'和'标签'"
这基本上意味着我不能同时做pull和addtoset.有没有其他方法可以做到这一点?
当然,我可以记住元素的所有ID,然后删除标记并添加单独的查询,但这听起来不太好.
我有文件看起来像这样:
{
"_id" : "someuniqueeventid",
"event" : "event_type_1",
"date" : ISODate("2014-01-14T00:00:00Z"),
}
Run Code Online (Sandbox Code Playgroud)
我想按" event
" 进行分组,并计算每周每天发生的事件类型的数量.基本上,我希望得到类似的东西:
{
"_id": "event_type_1",
"1": "number of event_type_1 for Monday",
"2": "number of event_type_1 for Tuesday",
...
},
{
"_id": "event_type_2",
...
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我坚持:
db.data.aggregate([ {$project: {date_of_week: {$dayOfWeek: "$date"}, event: "$event"}},
{$group: {_id: "$event", .... } ])
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?