通过mongoose过滤自定义键或值

时间:2018-02-23 16:12:16

标签: javascript mongoose

我有一个Message架构,有两种类型的消息:文字和语音,我该如何获得文字的价值?

文字数据示例:

{
    "_id" : ObjectId("5a8ea03d2601be24b086ccd4"),
    "userId" : 20,
    "text" : "Hi",
    "__v" : 0
}

语音数据示例:

   {
        "_id" : ObjectId("5a8ea03d2601be24b086ccd4"),
        "userId" : 20,
        "voice" : "d2601be24bd22601be24b",
        "__v" : 0
    }

代码:

Message
  .find({userId: '20'}, {_id: 0, text: ''})
  .exec((err, obj) => {
    if (err) {
      console.log(err);
    }

    for (const val of Object.values(obj)) {
      console.log(val.text);
    }
  });

输出:

Hi    // for text
undefined  // for voice

我在输出中有所有类型的消息,我应该如何获得所有文本值? (不是声音)?

1 个答案:

答案 0 :(得分:1)

几个选项,您可以在for循环中添加if语句,例如

for (const val of Object.values(obj)) {
    if(val.text) console.log(val.text);
}

或者,您可以将数据库查询调整为仅选择具有非空文本字符串的邮件,例如

Message
  .find(
    {
       userId: '20',
       text: {
           $exists: true,
           $ne: ''
    },
    {_id: 0, text: ''}
  )

注意:我的查询可能不太正确,因为我没有对它进行测试,但它会产生这种效果。有关类似概念,请参阅:Find MongoDB records where array field is not empty