Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb Mongo查询不同行上的不同属性_Mongodb - Fatal编程技术网

Mongodb Mongo查询不同行上的不同属性

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吗?无论何时,我都能找到同时打过电话和检查过电脑的用户吗?(基本上它是一个和在不同的行上)我想没有映射/减少工作是不可能的 我认为可以通过以下方式实现

我有一个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吗?无论何时,我都能找到同时打过电话和检查过电脑的用户吗?(基本上它是一个和在不同的行上)

我想没有映射/减少工作是不可能的

我认为可以通过以下方式实现:

1.首先,您需要运行map/reduce,生成如下结果:

{
 _id : "u100",
 value: {
   actions: [
       "phone-call",
       "computer-check",
       "etc..."
  ]
 }
}
2.然后您可以通过

查询上述m/r结果。有一个可用于您的查询的,类似于SQL
group 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建议的格式