Mongodb Mongo查询不同行上的不同属性
我有一个mongo系列和fields 访问id、用户id、日期、操作1、操作2 example: 1 u100 2012-01-01 phone-call - 2 u100 2012-01-02 - computer-check 例子: 1 u100 2012-01-01电话- 2 u100 2012-01-02-计算机检查Mongodb Mongo查询不同行上的不同属性,mongodb,Mongodb,我有一个mongo系列和fields 访问id、用户id、日期、操作1、操作2 example: 1 u100 2012-01-01 phone-call - 2 u100 2012-01-02 - computer-check 例子: 1 u100 2012-01-01电话- 2 u100 2012-01-02-计算机检查 我能进入mongodb吗?无论何时,我都能找到同时打过电话和检查过电脑的用户吗?(基本上它是一个和在不同的行上)我想没有映射/减少工作是不可能的 我认为可以通过以下方式实现
我能进入mongodb吗?无论何时,我都能找到同时打过电话和检查过电脑的用户吗?(基本上它是一个和在不同的行上)我想没有映射/减少工作是不可能的 我认为可以通过以下方式实现: 1.首先,您需要运行map/reduce,生成如下结果:
{
_id : "u100",
value: {
actions: [
"phone-call",
"computer-check",
"etc..."
]
}
}
2.然后您可以通过查询上述m/r结果。有一个可用于您的查询的,类似于SQLgroup by
运算符
我尚未对此进行测试,但您的查询可能类似于:
var results = db.coll.group({
key: { user_id: true },
cond: { $or: [ { action1: "phone-call" }, { action2: "computer-check" } ] },
initial: { actionFlags: 0 },
reduce: function(obj, prev) {
if(obj.action1 == "phone-call") { prev.actionFlags |= 1; }
if(obj.action2 == "computer-check") { prev.actionFlags |= 2; }
},
finalize: function(doc) {
if(doc.actionFlags == 3) { return doc; }
return null;
}
});
同样,我还没有测试过这个,它是基于我对文档的阅读。您正在按用户id
(键
声明)进行分组。要通过的行具有action1==“电话呼叫”
或action2==“计算机检查”
(cond
声明)。开始检查特定用户id
时的初始状态为0(initial
)。对于每一行,检查是否action1==“phone call”
并设置其标志,检查action2==“computer check”
并设置其标志(减少功能)。标记行类型后,检查以确保设置了两个标志。如果是,请保留该对象,否则将其删除(使用finalize
函数)
最后一部分是我唯一不确定的部分,因为文档没有明确说明可以在finalize
函数中删除记录。与您查看上述示例是否有效相比,我可能需要花费更多的时间来设置一些测试数据进行查看。您将无法使用单个查询来完成此操作--如果这是您在应用程序中经常执行的操作,我不推荐map/reduce--我建议使用$or运算符在mongodb中执行查询,然后在客户端上对其进行处理,以获得一组唯一的用户id
例如:
db.users.find({$or:[{"action 1":"phone-call"}, {"action 2":"computer-check"}]})
将来,您应该以不同的格式保存数据,如上面Andrew建议的格式