Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.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
Javascript Mongo聚合$match等价于{$where:“this.field1!==this.field2”}_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongo聚合$match等价于{$where:“this.field1!==this.field2”}

Javascript Mongo聚合$match等价于{$where:“this.field1!==this.field2”},javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,所以我有一个疑问, db.collection.find({$where:“this.field1!==this.field2”}) 但是现在我需要创建一个类似的查询,并将结果聚合到一个复杂的查询中,这是经过验证的,只有通过使用聚合管道或“cannon for a fly”并使用mapReduce选项才能完成 既然我想避免使用mapReduce,那么有没有一种方法可以实现类似于{$where:“this.field1!==this.field2”}的方法 一些观察结果,解决上述情况的一般方法的答

所以我有一个疑问,
db.collection.find({$where:“this.field1!==this.field2”})

但是现在我需要创建一个类似的查询,并将结果聚合到一个复杂的查询中,这是经过验证的,只有通过使用聚合管道或“cannon for a fly”并使用mapReduce选项才能完成

既然我想避免使用mapReduce,那么有没有一种方法可以实现类似于
{$where:“this.field1!==this.field2”}
的方法

一些观察结果,解决上述情况的一般方法的答案是最理想的,但如果不可能,为了解决我的问题,我还可以在查询中使用原始值,但有以下限制。我需要找到下面的内容

db.collection.find({ $or :[
    {field1: value},
    {field2: value}
], $and: [
    { field1: {$not: {$eq: value}}},
    { field2: {$not: {$eq: value}} }
]})
我尝试了上面的查询,但它会丢弃包含两个字段中的值的结果,我想要的是一种方法,可以同时丢弃两个字段中具有相同值的对象,但可以获得在两个字段中都具有相同值的文档,我通常更喜欢一个查询方法,但在阅读了很多之后,我认为避免mapReduce的唯一选择是

db.collection.find({$where: "this.field1 === this.field2"}, function (err, results){
    var match = { $or :[
        {field1: value},
        {field2: value}
        ], { 
        _id : { $not : {$in: results.map((x) => x._id)}}
    }
    db.collection([ {$match: match}, {$project: projectionObject}, ...., etc])
})

所以我将使用上面的be解决方案,它可以进行很多优化(我只是在写问题的时候写的),但是如果可能的话,我希望避免将一个非常大的ObjectID列表发送回数据库。我将对它进行一些重构,在where语句之前使用匹配运算符,这是一个复杂的情况,也许您可以使用
$cond
内部
$project

var projectDataForMatch = {
    $project : {
        _id : 1, //list all fields needed here
        filterThisDoc : {
            $cond : {
                if  : {
                    $eq : ["$field1", "$filed2"]
                },
            then : 1,
            else  : 0
        } //or use compare operator $cmp
    }
}
}

var match = {
    $match : {
        filterThisDoc : 1
    }
}

db.col.aggregate([projectDataForMatch, match])    

您可以根据需要扩展
$cond
,以满足您的需要。

我喜欢这种方法,我会等一天,看看是否有更容易阅读的内容出现,或者我想我会接受这个答案,而且这不仅为解决这种情况提供了很大的灵活性,但是使用这个技巧可以编写很多非常复杂的查询。由于管道允许多次使用match,我可以在以前过滤很多结果,然后应用这个技巧并再次匹配以减少cond操作的工作量。@galileopy-这就是聚合的威力:-)是的,是重复的,当时我真的很努力地想找到解决办法。我该怎么办?就这样吧?接近?还是合并问题?我觉得这一个更一般,或者我可以编辑它更一般。此外,这个问题是关于如何转换直观的where('this.a$operator this.b'),而另一个问题解决了相同的问题,但它仅在$match上下文中说明。