Как использовать метод массива pu sh с $ или несколькими $ in в NodeJS и MongoDB - PullRequest
0 голосов
/ 19 февраля 2020

Я внедрил систему, в которой зарегистрированный пользователь может иметь друзей и следить за теми, с кем он / она не хочет дружить. Исходя из этого, я реализовал систему для получения сообщений от этих пользователей. Теперь я хотел бы получить посты от пользователя loggedIn, а также от других постов (от друзей и пользователей, за которыми следует loggedIn - пользователь).

Для этого я должен добавить req.user._id это идентификатор пользователя loggedIn.

following и friends - это массивы объектов, содержащих идентификаторы пользователей.

На данный момент единственный способ сделать выборку как из следующих, так и из сообщений друзей, комментируя строки, в которых я пытаюсь сделать нажатия?

Теперь единственный способ получить сообщения пользователя loggedIn - это получить их только по одному из следующих сообщений пользователя. или сообщения пользователей друзей ... Я хочу получить их вместе с обоими массивами.

Я объяснил себе? Заранее спасибо.

  const { following, friends } = req.user;
  // Include currentLoggedIn user posts
  following.push(req.user._id);
  friends.push(req.user._id);

  // Fetch posts by  both users I follow and users I'm friends with
  const posts = await Post.find({
    $or: [{ user: { $in: [following, friends] } }]
  })
    .populate({ path: 'user', select: 'username avatar bio' })
    .sort('-date')
    .skip(startIndex)
    .limit(limit);

Надеюсь, я смогу объяснить. Вот код, который он мне сейчас выдает:

{
    "status": "error",
    "error": {
        "stringValue": "\"[ 5e0d1b9315a8f23df855e4c3, 5e0925629648903308163aeb ]\"",
        "kind": "ObjectId",
        "value": [
            "5e0d1b9315a8f23df855e4c3",
            "5e0925629648903308163aeb"
        ],
        "path": "user",
        "reason": {},
        "message": "Cast to ObjectId failed for value \"[ 5e0d1b9315a8f23df855e4c3, 5e0925629648903308163aeb ]\" at path \"user\" for model \"Post\"",
        "name": "CastError",
        "statusCode": 500,
        "status": "error"
    },
    "message": "Cast to ObjectId failed for value \"[ 5e0d1b9315a8f23df855e4c3, 5e0925629648903308163aeb ]\" at path \"user\" for model \"Post\"",
    "stack": "CastError: Cast to ObjectId failed for value \"[ 5e0d1b9315a8f23df855e4c3, 5e0925629648903308163aeb ]\" at path \"user\" for model \"Post\"\n    at new CastError (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\error\\cast.js:39:11)\n    at ObjectId.cast (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schema\\objectid.js:246:11)\n    at ObjectId.SchemaType.applySetters (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:975:12)\n    at ObjectId.SchemaType._castForQuery (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1389:15)\n    at ObjectId.SchemaType.castForQuery (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1379:15)\n    at C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1328:18\n    at Array.map (<anonymous>)\n    at ObjectId.handle$in (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1324:14)\n    at ObjectId.SchemaType.castForQuery (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1376:20)\n    at ObjectId.SchemaType.castForQueryWrapper (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\schematype.js:1353:17)\n    at cast (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\cast.js:296:39)\n    at cast (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\cast.js:58:18)\n    at model.Query.Query.cast (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\query.js:4683:12)\n    at model.Query.Query._castConditions (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\query.js:1861:10)\n    at model.Query.<anonymous> (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\query.js:1888:8)\n    at model.Query._wrappedThunk [as _find] (C:\\xampp\\htdocs\\myporn\\node_modules\\mongoose\\lib\\helpers\\query\\wrapThunk.js:16:8)\n    at C:\\xampp\\htdocs\\myporn\\node_modules\\kareem\\index.js:278:20\n    at _next (C:\\xampp\\htdocs\\myporn\\node_modules\\kareem\\index.js:102:16)\n    at process.nextTick (C:\\xampp\\htdocs\\myporn\\node_modules\\kareem\\index.js:507:38)\n    at process._tickCallback (internal/process/next_tick.js:61:11)"
}

Это означает (насколько я знаю), что req.user._id не может быть преобразован в тип данных MongoDB ObjectId, но затем я попытался запросить mongodb в моем файл, чтобы можно было использовать ObjectId, но он продолжает выдавать мне ту же ошибку.

Спасибо!.

1 Ответ

2 голосов
/ 19 февраля 2020

Вы можете попробовать что-то вроде этого, предполагая, что все входные данные в целом являются строками и должны быть преобразованы в ObjectId() перед запросом, если ваше поле user имеет тип ObjectId(), ваша проблема, кажется, ищите ObjectId() против то, что вы передаете, является массивом массивов. Также вам не нужно $or, так как есть только одно условие, если вы упомянули два или более, используйте $or:

const ObjectId = require('mongodb').ObjectId;

const { following, friends } = req.user;

// Include currentLoggedIn user posts
let mergedArray = [...following, ...friends];
mergedArray.push(req.user._id)
let usersArray = []
for (const i of mergedArray) {
    usersArray.push(new ObjectId(i))
}

// Fetch posts by  both users I follow and users I'm friends with
const posts = await Post.find({ user: { $in: usersArray } })
    .populate({ path: 'user', select: 'username avatar bio' })
    .sort('-date')
    .skip(startIndex)
    .limit(limit);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...