在Mongoose中使用AND获取两个OR查询的结果

时间:2016-04-16 16:29:30

标签: node.js mongodb mongoose

我正在用猫屎在AND中梳理两个OR查询,但没有得到理想的结果

{
  _id :"23432ferf",
  "catId" : 21,
  "attributes": [
        {
          "_id": "571237bfc02aad440c216f67",
          "attributeValueM": "metal|Frame Material"
        },
        {
          "_id": "571237bfc02aad440c216f66",
          "attributeValueM": "green|color"
        }
  ]
},
{
   _id :"23432ferh",
  "catId" : 21,
  "attributes": [
        {
          "_id": "571237bfc02aad440c216f67",
          "attributeValueM": "metal|Frame Material"
        },
        {
          "_id": "571237bfc02aad440c216f66",
          "attributeValueM": "blue|color"
        }
  ]
}

现在通过mongoose查询

var condition =  [
           { $or: [{ 'attributes.attributeValueM' : 'wood|Frame Material' }, { 'attributes.attributeValueM' : 'metal/Frame Material' }] },
           { $or: [{ 'attributes.attributeValueM' : 'blue|color' }, {'attributes.attributeValueM' : 'green|color'}] }
     ];

Test.find("catID":21).and(condition).exec(function (err, results) {
          ... // not getting any document
      });

我如何将两个OR条件与AND condotion结合起来? 已经在attributes.attributeValueM上建立了索引,它正在使用下面给出的简单AND条件

[ { 'attributes.attributeValueM': 'green|color' },
  { 'attributes.attributeValueM': 'metal|Frame Material' } ]

请建议

2 个答案:

答案 0 :(得分:1)

您可以使用

代替Test.find("catID":21).and(condition)
Test.find({
    $and: [
        { catID:21 },
        { $or: [{ "attributes.attributeValueM" : 'wood|Frame Material' }, { "attributes.attributeValueM" : 'metal/Frame Material' }] },
        { $or: [{ "attributes.attributeValueM" : 'blue|color' }, {"attributes.attributeValueM" : 'green|color'}] }
    ]
}).exec(function (err, results) {
     // rest of code
});

答案 1 :(得分:0)

我也对 AND OR 操作的混合方式感到麻烦。这是我工作过的一个简单示例。此代码段没有给我期望的结果,换句话说, AND OR 操作的正确组合。

    public class CustomWebViewClient : WebViewClient
    {
        public override bool ShouldOverrideUrlLoading(Android.Webkit.WebView view, IWebResourceRequest request)
        {
            Intent intent = new Intent(Intent.ActionView, request.Url);
            CrossCurrentActivity.Current.StartActivity(intent);
            return true;
        }
    }

但是稍微的改变就给了我理想的结果:

 awTextsDocuments = await AWTextModel
        .find({
          $and: [
            { name: { $regex: reqObj.q, $options: 'i' } },
            { $or: [ recordOwner: req.user._id,  'company-wide-visibility': { $in: 
                     true } ] },

          ],
        })
        .skip(reqObj.offset)
        .limit(reqObj.limit)
        .sort([mongoSortQuery]);

请注意 recordOwner “全公司可见性” 之前和之后的括号。这有所作为,并给了我令人满意的结果。