这个mongo $或查询有什么问题

时间:2017-04-29 21:01:58

标签: mongodb meteor mongodb-query

此查询完美无缺

{
$or:[{author:this.userId} , {somethingelse:true} ]
}

但是当我尝试时:

{
$or:[{author:this.userId} , {sharedwith[this.userId]:true} ]
}

我收到了消息

  

错误阻止启动:
         使用ecmascript处理文件时(对于目标os.linux.x86_64):server / main.js:113:43:意外的令牌,预期   ,(113:43)

     

=>您的应用程序有错误。等待文件更改。

那就是$或语句中逗号的位置

帮助

2 个答案:

答案 0 :(得分:2)

我想您是要尝试检索当前用户是作者的所有文档,已与他/她共享?因此,您使用sharedWith字段构建了文档,该字段是userId作为键的哈希映射,boolean作为值?

文件结构:

{
    author: string,
    sharedWith: {
        <userId1>: boolean
        // <userId2>…
    }
}

在这种情况下,您的MongoDB查询应使用dot notation指定sharedWith字段中嵌套字段的值:

{
    $or: [{
        author: string
    }, {
        "sharedWith.<userId>": boolean
    }]
}

要使用插值<userId>轻松创建查询,您可以在对象中使用computed key(ES6语法):

{
    $or:[{
        author: this.userId
    } , {
        // The query computed key must be in square brackets.
        // Specify the field child key using the dot notation within your query.
        ["sharedwith." + this.userId]: true
    }]
}

或者使用旧的ES5语法,类似于@ MichelFloyd的回答:

var query = {
        $or: [{
            author: this.userId
        }]
    };
var newCondition = {};

newCondition["sharedWith." + this.userId] = true;
query.$or.push(newCondition);

注意:上述文档结构可以方便地用数组替换sharedWith哈希映射(因为布尔值的false值可以简单地通过删除来替换数组中相应的userId

{
    author: string,
    sharedWith: [
        <userId1>
        // <userId2>…
    ]
}

在这种情况下,查询只是become

{
    $or:[{
        author: this.userId
    } , {
        // In MongoDB query, the below selector matches either:
        // - documents where `sharedWith` value is a string equal to
        //     the value of `this.userId`, or
        // - documents where `sharedWith` value is an array which contains
        //     an element with the same value as `this.userId`.
        sharedwith: this.userId
    }]
}

答案 1 :(得分:0)

在运行之前尝试将查询构建为变量。

let query = { $or: [{ author: this.userId }]};
const sw = sharedwith[this.userId];
query.$or.push({sw: true});
MyCollection.find(query);