如何编写一个查询,它在文档中使用两个字段

时间:2017-05-05 13:58:56

标签: node.js mongodb

标题可能还不够。在这里让我解释一下。

假设我的数据库结构为

{
    name: "alex",
    age: "21",
    location: "university-alex"
}

我知道这个数据库结构不合理但我只想以最短的方式显示我的问题。

我想获取location包含name字段值的文档。这里university-alex包含alex,因此它应该作为查询的结果返回。

到目前为止我做了什么? 我写了这个查询,但无法得到结果。

db.collection.find({location: {$regex: "$name"}})

如何编辑?

2 个答案:

答案 0 :(得分:0)

我认为您尝试实现的目标可以通过$where运算符完成。 根据{{​​3}}

db.collection.find({ $where: function() { 
  return (this.location.includes(this.name)); 
} } );

或者您可以将JS表达式传递给find方法:

db.collection.find(function() { 
  return (this.location.includes(this.name)); 
});

希望它有所帮助,
最好的问候

答案 1 :(得分:0)

@boehm_s的一部分答案是可行且非常清楚的,您还可以创建一个多字段索引,您可以使用它来查找所需内容。如果要执行组合查询方法,例如,这种索引非常有用。如果传递的参数与其内容匹配或包含在其中,则查找多个string字段。您可以查看有关Text Indexes的此文档页面。我不知道您是否使用Mongoose,但this answer可能有用。

请注意我的这种方法会返回包含在一个或两个字段中的所有文档的字样""你在寻找。

在字段上创建索引后

db.collection.createIndex(
   {
     name: "text",
     location: "text"
   }
 )

假设您已将此索引命名为txtIndex,那么,您可以

用于节点方式的Mongo驱动程序

. . .

let userProjection = {
    "name": 1,
    "age": 1,
    "location": 1
};

/**
 *  @param req Contains information to find a user
 *  @param req.findMe Contains name concatenated to location 
 */
let findUsers = (req) => {
    letUsers = db.collection('users');
    return new Promise((resolve, reject) => {
        User.findOne({'txtIndex': params.body.findMe}, {fields: userProjection},(err, user) => {
           if (err) {
               return reject({message: 'MongoDB Error', err: err});
           }
           if (!user) {
               return reject({message: 'User not found!'});
           }
               return resolve(user);
        });

    });
}

猫鼬方式

let Users = require('./users-model.js);

/**
  *  @param req Contains information to find a user
  *  @param req.findMe Contains name concatenated to location 
  */
let findUsers = (req) => {
   Users.findOne({txtIndex: req.body.FindMe}).then( function (err, user) {
         if (err) {
           return reject({message: 'MongoDB Error', err: err});
         }
         if (!user) {
           return reject({message: 'User not found!'});
         }
           return resolve(user);
    });    

}