【问题标题】:My mongodb/mongoose query conditions exclude themselves. Can you help me fixing that?我的 mongodb/mongoose 查询条件排除了自己。你能帮我解决这个问题吗?
【发布时间】:2017-02-24 18:23:00
【问题描述】:

当用户向我的node.js 应用程序提交内容时,他会输入四项内容:start_date、他的 Facebook 用户名、文本内容和一个标志,该内容是应该对所有人可见还是只对他的 Facebook 朋友可见。

当用户获取内容时,他可以从其他用户那里获取公开内容以及从他的 facebook 朋友那里获取内容(即使他们只为他们的朋友提交内容)。

我创建了一个mongoose 查询,它在这种情况下可以正常工作。我是这样做的:

var query = Test.find({})

if(startDate != undefined) {
    var startDate = new Date(req.param('startDate'));
    query = query.where('updated_at').gte(startDate);
}

if (friends != undefined) {
        var friendsSplitted = friends.split(",");
    for(var i=0; i<friendsSplitted.length; i++) {
        query = query.or([{ 'facebook_username': friendsSplitted[i] }]);
    }
}

query = query.where('hidden').equals(false);

if (publicFlag != undefined && publicFlag === "true") {
    query = query.or({friends_only: false});
}

使用上面的代码,当用户只查询他朋友的内容(可能是私人的或公共的)时,他 POSTs startDate,他的 friends 的数组,标志 hidden 设置为假和publicFlag 设置为假。构造查询:

猫鼬:test.find({ updated_at: { '$gte': new Date("2011 年 10 月 15 日,星期六 格林威治标准时间 00:00:00")},隐藏:假,'$or':[ { facebook_username: 'XXXXXXXXXXXXXXX' }, { facebook_username: 'YYYYYYYYYYYYYYY' } ] }) { 字段:未定义}

用户不仅可以查询他朋友(私人或公共)的内容,还可以查询其他人的公开内容。为此,他POSTs startDate,他的friends 的数组,标志hidden 设置为false 和publicFlag 设置为true。构造查询:

猫鼬:test.find({ updated_at: { '$gte': new Date("2011 年 10 月 15 日,星期六 格林威治标准时间 00:00:00")},隐藏:假,'$or':[ { facebook_username: 'XXXXXXXXXXXXXXX' }, { facebook_username: 'YYYYYYYYYYYYYYYY' }, { friends_only: false } ] }) { fields: undefined }

上面的代码工作正常。

我想添加另一种情况,当用户可以获取具有特定主题标签的内容时。 基本上,当用户选择此选项时,他可以看到仅包含这些主题标签的其他用户的内容。不过,该内容是他的 fb 朋友帖子(私人或公开)和其他人的帖子(即公开)。

为此,我考虑将这个条件添加到我原来的 node.js 代码中:

if (hashtagsInput != undefined) {
    var hashtags = hashtagsInput.split(",");

    for(var i=0; i<hashtags.length; i++) {
    query = query.or([{ 'hashtags': hashtags[i] }]);
    }
}

但此解决方案无法正常工作。

当用户想要获取他朋友的(私人和公共)内容和其他人的公共内容 - 但只包含一个主题标签 - 他 POSTs startDate,他的 friends 的数组,标志hidden 设置为false,publicFlag 设置为true 和他的hashtags 的数组。当他这样做时,它会创建一个查询:

猫鼬:test.find({ updated_at: { '$gte': new Date("2011 年 10 月 15 日,星期六 00:00:00 GMT")}, '$or': [ { hashtags: 'test1' }, { hashtags: 'test2' }, { facebook_username: 'XXXXXXXXXXXX' }, { facebook_username: 'YYYYYYYYYYYYYYYYYY' }, { friends_only: false } ], 已删除: false }) { 字段:未定义}

基本上,我只想将一般查询限制为特定主题标签。

此查询没有返回正确的数据。现在我不是mongoose 专家,昨天我花了几个小时试图弄清楚,但我认为问题在于它返回的数据要么包含一个主题标签,要么它的作者是我的一个脸书好友。

我想修复此查询,以便 - 如果用户 POSTs 有标签 - 它会获取他的朋友和所有人的公开和私有内容,但仅包含至少包含其中一个的内容标签。当用户不提供主题标签时 - 它应该照常工作,获取他朋友的所有私人和公共内容以及所有人的公共内容。

您能帮我修复我的node.js 代码,以便它创建正确的mongoose 查询吗?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    下面的代码将按您的意愿工作

    var query= {};
    query.$and = [];
    
    // and condition on start date
    if(startDate != undefined) {
        var startDate = new Date(req.param('startDate'));
        query.$and.push({"updated_at":{$gte: startDate}});
    }
    
    // and condition on hastags
    if (hashtagsInput != undefined) {
        var hashtags = hashtagsInput.split(",");
        query.$and.push({"hashtags":{$in: hashtags}});
    }
    
    // and condition on hidden
    query.$and.push({"hidden":false});
    
    
    // creating a OR condition for facebook friends and public flag
    var friend_query = {};
    friend_query.$or = [];
    
    if (friends != undefined) {
        var friendsSplitted = friends.split(",");
        friend_query.$or.push({"facebook_username":{$in: friendsSplitted}});
    }
    
    if (publicFlag != undefined && publicFlag === "true") {
        friend_query.$or.push({friends_only: false});
    }
    
    //Merging facebook friend condition with other condition with AND operator.
    query.$and.push(friend_query);
    
    
    var finalquery = Test.find(query)
    

    对不起,我用 Json 格式直接创建 mongodb 查询,这和你做的没什么不同。这将按照您提到的问题进行。

    如果它不能解决您的问题,请告诉我。

    【讨论】:

    • 谢谢 Puneet,效果很好,我还有一个小问题 - 如果我想传递另一个参数,例如用户名并在此查询中使用它,我是否必须通过添加:if (username != undefined) { query.$and.push({"username": username}) }? or is there any other specific way, such as .equals` 等来修改它?
    • 您需要使用 query.$and.push({"username":username}),您也可以使用其他方式执行此操作,但我不是猫鼬方法的家庭,我也建议您使用直接更改 mongodb 查询,这样您可以进行更复杂的查询。如果您发现答案有用,请接受它作为正确答案。 :)
    • 非常感谢 Puneet 的帮助!最后一个问题-您写了有关更改 mongodb 查询的文章,这是什么意思?你能在 cmets 给我一些小例子吗?谢谢!
    • 我的意思是说不要使用mongoose ODM的equal、where或method,你应该使用mongodb查询,这里是你可以查看的链接docs.mongodb.com/manual/tutorial/query-documents
    • 非常感谢普内特!
    猜你喜欢
    • 2011-01-24
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    相关资源
    最近更新 更多